Ruby:在测试目录创建时错误地引发了异常

时间:2016-04-17 16:46:46

标签: ruby rspec

我的应用程序中有一个名为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

现在毫无疑问,验证是事先完成的。但我仍然得到同样的错误。

1 个答案:

答案 0 :(得分:1)

如果path是目录,则

Dir.exists?(path)返回true,否则返回false。在valid_database?中,您传递的是完整路径名,我猜这是指向非目录文件。

请参阅http://ruby-doc.org/core-2.1.2/Dir.html#method-c-exists-3F