【发布时间】:2013-03-28 15:44:01
【问题描述】:
我在 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]
这是我期望得到的错误,我只是不知道如何调整测试以通过。有什么建议吗?
【问题讨论】:
-
我注意到两件事,首先,在真正的异常之前对
Call.count的调用只是为了调试目的?因为如果不是,它可能会引发异常,为什么不使用传统的expect{}.to raise_error参见relishapp.com/rspec/rspec-expectations/v/2-6/docs/…? -
哈哈哇。不敢相信它一直就在我面前。非常感谢!留下一个答案,我会为你接受!
标签: ruby-on-rails database activerecord rspec