以下测试第一次通过(rake db:test:prepare
之后),但失败在后续运行时出错。
Capybara::ElementNotFound:找不到css "#sale_payment_btn"
require "test_helper"
DatabaseCleaner.strategy = :transaction
class SaleFeatureTest < Capybara::Rails::TestCase
include Warden::Test::Helpers
Warden.test_mode!
self.use_transactional_fixtures = false
setup do
login_as users(:admin), scope: :user
Capybara.current_driver = :selenium #:webkit
DatabaseCleaner.start
end
teardown do
DatabaseCleaner.clean
Warden.test_reset!
end
test "Sale" do
visit(new_sale_path) # create new sale and redirect to it
assert page.has_css?('#sale_payment_btn') # gave error at second time
find(:css, '#sale_payment_btn').click # this create payment
end
当我使用硒和铬时,我可以看到销售的ID。我注意到后续测试的 ID 是相同的。即 980190963
我的理论是
database_cleaner
无法按预期运行。(虽然我看到数据库清理test.log
文件上的sql命令,但我看到数据保留在数据库中)visit
不会创建新的@sale
(如此处所述,尽管我使用 minitest),因为#sal_payment_btn
没有呈现(销售在第一次运行时已经payment
)。
我现在把头发拉了半天。我试过了
-
webkit
驱动程序 - 不同的清洁策略
truncation
、deletion
而且我仍然无法在第二次运行时通过测试。它在手动测试中运行正常。
我做错了什么,哪里做错了?
附言我正在使用以下宝石
minitest-rails-capybara
selenium-webdriver
chromedriver-helper
database_cleaner
minitest-around
pg
我已阅读以下内容
- http://blog.berylliumwork.com/2013/07/rails-4-devise-3-minitest-and-capybara.html
- 数据库清理程序在最小测试轨道中不起作用
- Rails minitest,数据库清理器如何转use_transactional_fixtures = false
我已经确认问题出在我database_cleaner
的设置上。
短版本
:transaction
策略不适用于我的设置cucumber
+ webkit
/selenium
.改为:deletion
策略。
我学到了什么
看来我学得不够。我在寻找答案时发现了以下内容。
-
有人问为什么数据库清理器事务策略不适用于Cucumber和Selenium? - 没有答案
-
如何为黄瓜和RSpec的Rails设置database_cleaner
:transaction
策略不适用于硒 -
database_cleaner
自述文件指出,:transaction
策略要求做更多的工作但是,如果您最终需要在测试中使用多个数据库连接(即您的测试在与应用程序不同的进程中运行),那么使用此策略将变得更加困难
其他值得一读的内容
- 为什么要使用数据库清理程序的
deletion
策略 - 最推荐的设置
database_cleaner
的方法与rails
,rspec
,capybara
和selenium
- http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/ - 用于用户登录的Rails 4,Devise 3,MiniTest和Capybara。