0

我在 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

我已经使用 a 测试了这段代码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]

这是我期望得到的错误,我只是不知道如何调整测试才能通过。有小费吗?

4

2 回答 2

0

呼吁

puts Call.count

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

于 2013-03-28T16:16:01.347 回答
0

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

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

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

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

于 2013-03-28T16:17:26.357 回答