1

我是新来的rails。在我的项目中,我使用rspec + capybara + poltergeist + selenium + database_cleaner。测试之间的轨道清理数据库不起作用

的源代码github link

我的PostgreSQL 9.5.5,Ubuntu的LTS 16.04。

当运行测试

rspec spec/controllers # everything work fine 

当运行

rspec spec/features # everything work fine too 

但是当我运行所有测试

rspeC# part of tests fail 

当运行一次验收有:硒 - 在浏览器28> 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 
+1

你为什么认为必须是1?根据你的设置database_cle aner可能数据库为空但不能重置id列计数器 - 您是否查询过数据库以查看其中保存了多少个问题?你的测试不应该有任何硬编码的记录ID。如果这不是问题,那么将你的一个测试和你的database_cleaner配置添加到你的问题中。 –

+0

我将文件添加到问题。并且默认情况下,我认为,db中的这个问题是一个,并且添加文件的链接必须具有链接href:'/uploads/attachment/file/1/test_file.dat',其中1是问题标识。但实际上,问题ID是28.我认为每次测试运行时数据库清理表都会清理干净。 –

+1

@ThomasWalpole - 我明白你在说什么。是的,桌子只有一排。我需要重写我的测试。感谢您的解决方案。 –

回答

2

清洁表意味着它会删除所有的记录,这并不一定意味着它会重置索引计数器 - 就像删除记录3然后添加新记录一样 - 新的记录将会是4.因此,在您的情况下,可能会删除27条记录,并且您创建的下一个记录将为28,即使存在只有1条实际记录。查询数据库以查看有多少实际记录用于验证。

接下来,您的数据库清理配置应该更像是推荐配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。 append_after vs after对于稳定性和检查驱动程序名称是非常重要的,只是: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(...)第一种方式禁用水豚的重试行为,会导致片状测试

最后 - 你有expect(page).not_to have_content t('common.button.ready'),我猜应该是expect(page).not_to have_button t('common.button.ready')

+0

谢谢你的详细答案。 –

相关问题