我的应用程序中有一个名为FileSystem的模块,它执行基本的文件系统功能。这是相关的代码。
module TxtDB
module FileSystem
def self.create_database(db)
fpdb = db_full_path(db)
Dir.mkdir(fpdb) unless ((not valid_parameter?(db)) or (not valid_database?(fpdb)))
end
private
def self.valid_parameter?(db)
raise TxtDB::NIL_PARAMETER_ERROR unless (not db == nil)
raise TxtDB::NOT_A_STRING_ERROR unless (db.is_a? String)
raise TxtDB::EMPTY_PARAMETER_ERROR unless (not db.empty?)
true
end
def self.valid_database?(db)
raise TxtDB::DATABASE_ALREADY_EXISTS_ERROR unless (not Dir.exist?(db_full_path(db)))
true
end
def self.db_full_path(db)
"#{TxtDB::BASE_DIRECTORY}/#{db}"
end
end
end
这是我对此功能的Rspec测试
it 'raises a StandardError (Database already exists) if it receives the name of an existing database' do
base_path = TxtDB::BASE_DIRECTORY
if (not Dir.exist?(base_path)) then
Dir.mkdir(base_path)
end
db_path = File.join(TxtDB::BASE_DIRECTORY,'testedb')
if (not Dir.exist?(db_path)) then
Dir.mkdir(db_path)
end
expect {
TxtDB::FileSystem::create_database('testedb')
}.to raise_error(StandardError, TxtDB::DATABASE_ALREADY_EXISTS_ERROR)
end
碰巧当我运行测试时出现此错误
expected StandardError with "Database already exists", got #<Errno::EEXIST: File exists @ dir_s_mkdir - txtdb/testedb>
当我看到事情时,这不应该发生,因为我在调用 Dir.mkdir 之前测试存在。但我明显错了,因为错误发生了。问题是:我错在哪里?
==========
根据Peter Alfvin的建议(见下面的答案),我将方法改为
def self.create_database(db)
fpdb = db_full_path(db)
if (valid_parameter?(db) and valid_database?(fpdb)) then
Dir.mkdir(fpdb)
end
end
现在毫无疑问,验证是事先完成的。但我仍然得到同样的错误。
答案 0 :(得分:1)
Dir.exists?(path)
返回true
,否则返回false
。在valid_database?
中,您传递的是完整路径名,我猜这是指向非目录文件。
请参阅http://ruby-doc.org/core-2.1.2/Dir.html#method-c-exists-3F