Ruby on rails 如何调试与时间相关的rspec测试失败?
我正在学习rails教程,我已经完成了很多测试(124) 我开始遇到一个问题,有时一组测试会随机失败,但当我尝试使用同一种子复制它们时,它们通过了。失败似乎主要与用于生成唯一用户电子邮件的FactoryGirl序列有关。大多数情况下,测试都通过了,如果我没有提供种子就运行,那么失败的几率可能是10% 下面是我看到的一个例子: 下面是rspec测试代码,它似乎有时会失败Ruby on rails 如何调试与时间相关的rspec测试失败?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在学习rails教程,我已经完成了很多测试(124) 我开始遇到一个问题,有时一组测试会随机失败,但当我尝试使用同一种子复制它们时,它们通过了。失败似乎主要与用于生成唯一用户电子邮件的FactoryGirl序列有关。大多数情况下,测试都通过了,如果我没有提供种子就运行,那么失败的几率可能是10% 下面是我看到的一个例子: 下面是rspec测试代码,它似乎有时会失败 describe "pagination" do before(:all) { 30.times { Facto
describe "pagination" do
before(:all) { 30.times { FactoryGirl.create(:user) } }
after(:all) { User.delete_all }
it { should have_selector('div.pagination') }
it "should list each user" do
User.paginate(page: 1).each do |user|
page.should have_selector('li', text: user.name)
end
end
end
这是工厂:
FactoryGirl.define do
factory :user do
sequence(:name) { |n| "Person #{n}" }
sequence(:email) { |n| "person_#{n}@example.com"}
password "foobar"
password_confirmation "foobar"
factory :admin do
admin true
end
end
factory :micropost do
content "Lorem ipsum"
user
end
end
更新:
该问题与某些测试后未清理测试数据库有关。我可以(并且确实)找到创建用户的测试。
我决定使用数据库_cleaner gem,并按照此处的建议进行配置:
也许以前的测试正在设置这些用户。在创建User.delete\u all之前,请尝试将其放入before筛选器中。这可能与您的问题有关:测试启动时,您的测试数据库是否可能不为空?您是否在上运行事务?@PeterAlfvin我不确定,如何检查?从命令行执行
rails dbconsole test
,然后从用户执行select*代码>。假设您的测试数据库中预先存在的用户与工厂生成的用户具有相同的格式名称和电子邮件,并且假设您在测试开始时没有清除这些用户,那么无论何时在工厂中获得“最多”该序列值,您都会收到一个错误。