所以我设置了我的RSpec环境,为我的RSpec Capybara测试使用截断清理策略,但是当我使用Webkit作为我的Javascript驱动程序时,我仍然发现某些东西仍然在我的测试中包装。
我对Selenium没有这个问题,这让我感到难过。
以下是与webkit相关的RSpec配置:
Capybara.javascript_driver = :webkit
Capybara.register_driver :webkit do |app|
Capybara::Webkit::Driver.new(app).tap do |driver|
driver.allow_url "fonts.googleapis.com"
driver.allow_url "dl.dropboxusercontent.com"
end
end
config.before(:suite) do
DatabaseCleaner.clean_with :truncation
DatabaseCleaner.clean_with :transaction
end
config.after(:each) do
ActionMailer::Base.deliveries.clear
end
config.around(:each, type: :feature, js: true) do |ex|
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start
self.use_transactional_fixtures = false
ex.run
self.use_transactional_fixtures = true
DatabaseCleaner.clean
end
我的功能测试看起来像这样:
feature "profile", js: true do
describe "a confirmed user with a valid profile" do
before(:each) do
@user = FactoryGirl.create :user
signin(@user.email, @user.password)
end
scenario 'can edit name' do
visit edit_user_profile_path
fill_in :user_name, with: 'New name'
click_button :Submit
@user.reload
expect(@user.name).to eq('New name')
expect(current_path).to eq show_user_path
end
end
end
如果我使用Webkit运行此测试它会失败,但是使用Selenium它会通过。
我已经尝试了一些调试。如果我在#update操作中放置一个调试器语句,我发现它正确地更新了数据库。如果我当时连接到测试数据库,我可以在数据库中看到新信息,这意味着此更新无法包含在事务中。但是,但是在.spec @user的调试器中仍然会看到由factory_girl中的FFaker生成的原始名称。这让我相信测试是在事务中运行的。
当我将我的JavaScript驱动程序更改为Selenium时,一切正常。
有什么想法吗?
答案 0 :(得分:0)
哇。在发布问题后我几乎立即发现了这个问题。没有涉及交易。
这是后端和webkit / selenium前端之间的竞争问题。使用Webkit,测试在控制器有机会更新数据库之前执行@ user.reload和expect语句。与Selenium相反,它是另一种方式。
诀窍是让Capybara等待页面重新加载。我把测试改为:
scenario 'can edit name' do
visit edit_user_profile_path
fill_in :user_name, with: 'New name'
click_button :Submit
expect(current_path).to eq show_user_path
@user.reload
expect(@user.name).to eq('New name')
end