抛出RSpec测试错误,ActiveRecord连接

时间:2013-03-28 15:44:02

标签: ruby-on-rails database activerecord rspec

我在Rails应用程序中做了一件有趣的事情,连接到不同的数据库来读取信息,但没有写出来。为了便于进行这些连接,我编写了用于处理表的模型。我有两个类似的课程,所以这里有一个可以解决问题:

# call.rb
class Call < ActiveRecord::Base
  # We don't want to change these values in the table, only read them
  attr_reader :uniqueid, :queue, :agent_id, :codes, :code_count

  def self.connect
    establish_connection "ihs"
    self.table_name = 'calls'
  end

  def self.disconnect
    self.connection.close
  end
end

我不希望此连接覆盖与Rails应用程序数据库的主连接,这只是一个临时的事情。所以现在,我想测试这些连接实际建立和关闭,只要我调用这些方法。目前,这就是我所想到的:

# call_spec.rb
describe Call do

  [code omitted]

  describe "#connect" do
    # before { Call.disconnect }

    it "establishes a connection to IHS DB" do
      puts Call.count
      lambda { Call.count }.should raise_error(ActiveRecord::StatementInvalid)
      Call.connect
      lambda { Call.count }.should_not raise_error
    end
  end
end

我已使用begin ... rescue Exception => e; puts e.class; end测试此代码以验证抛出的异常类型,它确实是一个ActiveRecord :: StatementInvalid异常,但此测试未通过。我抛出的错误内容如下:

Failure/Error: puts Call.count
  ActiveRecord::StatementInvalid:
    PG::Error: ERROR:  relation "calls" does not exist
      [rest omitted]

这是我期待得到的错误,我只是不知道如何调整测试才能通过。有什么提示吗?

2 个答案:

答案 0 :(得分:0)

致电

puts Call.count

在实际异常之前,在rspec'捕获'它之前引发错误。

答案 1 :(得分:0)

我想知道为什么明确连接和断开连接很重要?在我想要连接到辅助数据库以进行读取的一个应用程序中,我将所有activerecord类继承自负责连接的基类,如下所示:

class IhsActiveRecord < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "#{Rails.env}_ihs"
end

这样您就不会经常重新连接和断开连接,并且可以将连接逻辑保存在一个位置。实际的连接信息仍然可以放在database.yml文件中。上面,我在每个环境中都有一个单独的环境,只要它与您的database.yml匹配就可以调整。

我还建议在规范中使用expect {}而不是lambda。