我在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]
这是我期待得到的错误,我只是不知道如何调整测试才能通过。有什么提示吗?
答案 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。