Rails 在测试之间清理数据库不起作用
Rails clean database between tests not work
我是 rails 的新人。在我的项目中,我使用 rspec + capybara + poltergeist + selenium + database_cleaner.
源代码github link
我有 postgresql 9.5.5,ubuntu 16.04 LTS。
当运行测试
rspec spec/controllers # everything work fine
当运行
rspec spec/features # everything work fine too
但是当我运行所有测试
rspec # part of tests fail
当运行第一次在浏览器28中用:selenium -> question_id验收时,但必须是1,因为它使用database_cleaner.
为什么 database_cleaner 不清理我的数据库?我做错了什么?我花了一天时间寻找解决方案,但一无所获。
请帮助我。
P.S。这是一个培训项目。
我的Database_Cleaner配置是:
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
Warden.test_reset!
if Rails.env.test?
FileUtils.rm_rf(Dir["#{Rails.root}/public/uploads"])
end
end
在这里您可以阅读如何使用 RSpec
和 Capybara
配置 database_cleaner
- https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example
清理表意味着它会删除所有记录,这并不一定意味着它会重置索引计数器 - 就像你删除记录 3 然后添加一条新记录 - 新记录将是 4。所以在你的如果可能有 27 条记录已被删除,而您创建的下一条记录将是 28 条,即使只有 1 条实际记录。查询数据库以查看有多少实际记录以验证这一点。
接下来,您的数据库清理器配置应该更像推荐的配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。 append_after vs after 对于稳定性很重要,检查驱动程序名称 vs 只是 :js 元数据也是如此。
在您的测试中检查 href '/uploads/attachment/file/1/test_file.dat' 时,您不应该在那里检查硬编码的 '1',您应该根据您创建的记录的记录 ID 号进行检查。所以“/uploads/attachment/file/#{question.id}/test_file.dat”(显然 question.id
将取决于您创建的对象和您的变量名称,但至少匹配一个我认为你的测试。
此外,在快速查看您的规格后 - 您所做的任何地方 expect(current_path).to eq ...
都是错误的。你应该做 expect(page).to have_current_path(...)
。第一种方法禁用 Capybara 的重试行为,将导致不稳定的测试。
最后 - 你有 expect(page).not_to have_content t('common.button.ready')
,我猜应该是 expect(page).not_to have_button t('common.button.ready')
我是 rails 的新人。在我的项目中,我使用 rspec + capybara + poltergeist + selenium + database_cleaner.
源代码github link
我有 postgresql 9.5.5,ubuntu 16.04 LTS。
当运行测试
rspec spec/controllers # everything work fine
当运行
rspec spec/features # everything work fine too
但是当我运行所有测试
rspec # part of tests fail
当运行第一次在浏览器28中用:selenium -> question_id验收时,但必须是1,因为它使用database_cleaner.
为什么 database_cleaner 不清理我的数据库?我做错了什么?我花了一天时间寻找解决方案,但一无所获。 请帮助我。
P.S。这是一个培训项目。
我的Database_Cleaner配置是:
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
Warden.test_reset!
if Rails.env.test?
FileUtils.rm_rf(Dir["#{Rails.root}/public/uploads"])
end
end
在这里您可以阅读如何使用 RSpec
和 Capybara
配置 database_cleaner
- https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example
清理表意味着它会删除所有记录,这并不一定意味着它会重置索引计数器 - 就像你删除记录 3 然后添加一条新记录 - 新记录将是 4。所以在你的如果可能有 27 条记录已被删除,而您创建的下一条记录将是 28 条,即使只有 1 条实际记录。查询数据库以查看有多少实际记录以验证这一点。
接下来,您的数据库清理器配置应该更像推荐的配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。 append_after vs after 对于稳定性很重要,检查驱动程序名称 vs 只是 :js 元数据也是如此。
在您的测试中检查 href '/uploads/attachment/file/1/test_file.dat' 时,您不应该在那里检查硬编码的 '1',您应该根据您创建的记录的记录 ID 号进行检查。所以“/uploads/attachment/file/#{question.id}/test_file.dat”(显然 question.id
将取决于您创建的对象和您的变量名称,但至少匹配一个我认为你的测试。
此外,在快速查看您的规格后 - 您所做的任何地方 expect(current_path).to eq ...
都是错误的。你应该做 expect(page).to have_current_path(...)
。第一种方法禁用 Capybara 的重试行为,将导致不稳定的测试。
最后 - 你有 expect(page).not_to have_content t('common.button.ready')
,我猜应该是 expect(page).not_to have_button t('common.button.ready')