我最近有一个小型的Rails项目,可以帮助我学习环境以及随之而来的相关语言/工具(Ruby,Cucumber,RSpec,Haml ......)。
最近让我感到困惑的是,我决定从one scenario转到this gist所见的倍数。当我介绍第二种情景时,我注意到矿物堆的总价值没有被总结,这是因为“我已开采该矿物”的步骤定义如下:
Given /^I have mined "([^"]*)" of that mineral$/ do |amount|
visit(root_path)
fill_in(@mineral.name, :with => amount)
end
罪魁祸首显然是访问(root_path)调用,一旦填写新字段,就会重置已经填写的字段。但重要的是要注意的是,除了“总值:”失败之外最后,所有的测试都是绿色的。
我决定,因为在这个功能中完成的所有内容都需要一个在索引/根页面上(我稍后可能会改变它),我只是把它放到Background:
块中。相应的步骤定义只不过是将访问(root_path)行提取到自己的步骤中。
然而,这导致每次fill_in()调用失败,并带有以下内容(或非常类似的内容):
cannot fill in, no text field, text area or password field with id, name, or label 'tritanium' found (Capybara::ElementNotFound)
(eval):2:in `fill_in'
./features/step_definitions/miner_converts_minerals.rb:12:in `/^I have mined (\d+) of that mineral$/'
features/miner_converts_minerals.feature:12:in `And I have mined <amount> of that mineral'
我对此的看法是,由于某种原因,Background:
中页面的访问并不持久,并且由于某种原因它忘记了它到达那里。请注意(如上所述)一旦访问(root_path)移出“我已经开采......”,它就会停止工作 - 进入一个单独的步骤,让我猜测访问必须在同一个内部完成阻止,但我可能是错的。
编辑:我尝试使用save_and_open_page
方法查看此页面上Capybara无法找到元素的实际内容。事实证明,“计算”按钮就在那里,但表中没有任何字段存在。看起来问题在于没有生成字段。
我认为解决这个问题的所有相关代码都可以在上面提到的要点中找到。谢谢你的阅读!
答案 0 :(得分:1)
事实证明,主要原因是测试数据库具有Mineral
的表但没有导入行。
这反过来导致find_or_create_by_name
方法能够创建测试中提到的矿物质,而不是其他的方法,在visit(root_path)
调用添加到"Given I have mined..."
时,会产生一些工作的错觉。 find_by_name
- 阻止(在.feature文件中)。
解决方案是正确播种测试数据库,然后使用find_or_create_by_name
代替{{1}}。