我有一个 Rails 服务器,我正在尝试在 Mac 上使用 RSpec、Capybara 和 Selenium 运行测试。我有一个命令行程序,它包含执行 iOS 调用的库,并试图在测试期间调用所述程序。问题是,就控制器而言,数据库中的相应表是空的,即使在保存调用之后也是如此。
所以测试看起来像:
let(:device) {FactoryGirl.create(:device)}
before do
puts Device.count
Capybara.current_driver = :selenium #otherwise, never even asks for the controller
Capybara.current_session.mode #not sure why this is necessary, but it appears that without this line, the test fails. Looks like a timing issue.
device.save #created by the previous let call via FactoryGirl
puts Device.count #spits out a count of 1, the device object
@transactions = Transaction.count
system(networkTester, serverURL, device.id, device.password)
end
it "should give an expected response" do
response.status.should eq(200) #response is empty
json = JSON.parse(response.body)
Transaction.count.should be @transactions + 2
end
在设备控制器内部,我添加了调试代码:
puts params
@device = Device.[matching criteria].first
puts @device
puts Device.count
我的想法是我应该能够看到适当的参数(我可以),并且设备计数应该不为零(它不是;它始终为零)。
我必须为此使用硒;如果我将驱动程序留在 rack_test,则永远不会调用命令行函数(即puts params
永远不会调用该行)。Capybara.current_session.mode #
出于同样的原因,我也必须打电话;即,没有它,控制器似乎永远不会被调用(我通过puts
基于 - 的调试发现了这一点)。
此时,测试结果本身如下所示:
Rack::File headers parameter replaces cache_control after Rack 1.5.
Run options: include {:focus=>true}
0
1
{"authcheck"=>nil, ....}
0
2013-07-05 17:58:42.788 NetworkTester[893:707] Not Authorized.
第一个零是 first puts Device.count
, the1
是puts Device.count
afterdevice.save
被调用的结果。这{}
是从控制器内部放入的参数,然后是空行puts @device
,0
用于表的计数Device
。据我所知,这意味着在控制器中,Device
表是空的;但是,从测试方面来看,该Device
表只有一个条目。因为就控制器而言,数据库中没有任何内容,所以 NetworkTester 失败。
如果我在测试环境之外运行代码,输出看起来更合理;即,Device
就控制器而言,表格具有内容。
那么为什么Device
表在测试期间要么没有条目,要么只有一个条目?更重要的是,如何让Device
表格在整个测试过程中都有内容?
这是 Rails 3.2.13、2.13.1 的 RSpec 核心、2.13.2 的 rspec-rails、capybara 2.0.3 和 selenium-webdriver 2.33.0。如果需要,我可以提供其他版本。