用水豚清理数据库

database cleanup with capybara

我正在使用水豚、minitest、database_cleaner gem,我很好奇数据库清理器在我 运行ning 测试后没有清理我的数据库,测试 运行ning 很好,用户已创建并可以成功登录,然后我用相同的数据重新 运行 测试,它说电子邮件已经被占用,意思是:database_cleaner 而不是 运行ning

下面是我的测试

require "test_helper"
require "database_cleaner"

feature 'register new user' do
  scenario 'register', js: true do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.start
    visit '/sign_up'
    within '#new_user' do
      fill_in 'User name', with: 'user4'
      fill_in 'Email',     with: 'user4@gmail.com'
      fill_in 'Password',  with: 'password4'
      fill_in 'Password Konfirmasi', with: 'password4'
      click_button 'Sign up'
    end
    DatabaseCleaner.clean
    page.must_have_content 'USER SETTING & INFO'
  end  
end

下面是我测试用的 Gemfile

group :development, :test do
  gem 'selenium-webdriver', '2.53.4'
  gem 'minitest-rails-capybara'
  gem 'minitest-reporters'
  gem 'database_cleaner'
end

您需要将 page.must_have_content 'USER SETTING & INFO' 放在 DatabaseCleaner.clean 行之前。这是因为当您单击按钮时,它可以立即 return 而按钮单击触发的请求是异步发生的。在您的情况下,这意味着您单击按钮,然后清理数据库,同时发送创建新用户的请求,并且很可能在数据库已经被清除之后到达,从而创建一个未被清除的用户。

通常,DatabaseCleaner 方法会从 setup/teardown 使用 minitest(before/append_after 块 RSpec)调用,以确保在测试完成之前不会进行数据库清理,并且即使测试失败,他们也会得到 运行。