2

我有一个 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, the1puts Device.countafterdevice.save被调用的结果。这{}是从控制器内部放入的参数,然后是空行puts @device0用于表的计数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。如果需要,我可以提供其他版本。

4

1 回答 1

0

就放

config.use_transactional_fixtures = false

在规范/spec_helper.rb

于 2017-07-06T11:43:43.067 回答