gpt4 book ai didi

ruby-on-rails - 为什么这个请求规范会间歇性地失败,或者我该如何调试它?

转载 作者:行者123 更新时间:2023-12-04 05:55:06 25 4
gpt4 key购买 nike

这是间歇性失败的测试:

  context "as a regular_user" do
before :each do
@user = FactoryGirl.create(:user, :role => 'regular_user')
visit new_user_session_path unless current_path == new_user_session_path
fill_in "Email", :with => @user.email
fill_in "Password", :with => @user.password
click_button "Sign In"
end

it "removes thing from favorites while on thing index page" do
@things = FactoryGirl.create_list(:thing, 5)
@user.set_mark :favorite, @things.first
@user.reload.favorite_things
visit things_path unless current_path == things_path
expect{
first(:link, "Remove from favorites").click # Sometimes this fails
@user.reload.favorite_things
}.to change { @user.favorite_things.count }.by(-1)
page.should have_content("Sort by")
end
end

我正在使用 gem markable提供收藏夹功能。

当我用 rspec 运行规范时,成功/失败似乎没有任何模式。 (它不像一旦失败就总是失败,反之亦然)。当规范通过 guard 运行时可能存在一种模式( spork 也被使用)因为如果我开始 guard并且测试通过然后它将始终通过 guard 的实例正在运行... Sames 失败 - 如果我开始 guard它失败了,然后在 guard 的那个实例中进行所有后续运行也会失败。

刚才我跑了rspec spec/requests/users_spec.rb:148运行那个规范,但它失败了:

1) Users as a regular_user removes thing from favorites while on thing index page
Failure/Error: click_link "Remove from favorites" # Sometimes this fails
Capybara::ElementNotFound:
Unable to find link "Remove from favorites"
# ./spec/requests/users_spec.rb:155:in `block (4 levels) in <top (required)>'
# ./spec/requests/users_spec.rb:153:in `block (3 levels) in <top (required)>'

我跑了 rspec spec/requests/users_spec.rb:148紧接着又一次,它成功了:

Finished in 0.83754 seconds
1 example, 0 failures

我尝试在 <% @things.each do |thing| %> 中添加“asdfasdf”节index.html.erb查看文件,并使用 page.should have_content("asdfasdf") 进行检查这有时会失败。我尝试添加 page.should have_selector('.favoritesblock', visible: true)就在 expect 之前 block ( favoritesblock 存在于 View 中的同一 @things block 中),有时会失败。它永远不会在 <% @things.each do |thing| %> 之外找到文本。然而,循环。

我添加了 save_and_open_page就在 first(:link, "Remove from favorites").click # Sometimes this fails 之前行,并且能够生成规范失败的实例。该页面仅包含两件事(我的 FactoryGirl 调用应该创建 5)并且它们都没有“从收藏夹中删除”链接(取决于该东西是否被收藏,它显示“添加到收藏夹”或“删除来自收藏”)。

基于此,我尝试稍微修改规范的前两行,但没有帮助(有时仍然会失败):

5.times { FactoryGirl.create(:thing) }
@user.set_mark :favorite, Thing.first

我确实注意到,当它成功时,它确实首先显示“从收藏夹中删除”链接,但并不总是显示所有 5 个内容。

所以,我需要知道为什么这个规范会间歇性地失败,或者我还能做些什么来找出导致问题的原因。有什么想法吗?

最佳答案

我设置工厂的方式是导致间歇性 rspec 失败的原因。

该项目有一个 bool 字段,active,它要么在网站上显示该项目(如果它为 true),要么不在网站上显示该项目(如果它是 false)。

我对我的工厂很聪明,并将该字段设置为 f.active { [true, false].sample }。因此,有时工厂会创建活跃的事物,有时会创建不活跃的事物。我有目的地创建我的工厂以这种方式运行,因为我希望默认工厂创建尽可能广泛的现实世界事物选择。我只需要记住,有时需要手动设置某些方面 - 就像在这种情况下,我只需要创建事件的东西。

解决方法是将我的规范更改为仅创建事件的东西:

@things = FactoryGirl.create_list(:thing, 5, :active => true)

关于ruby-on-rails - 为什么这个请求规范会间歇性地失败,或者我该如何调试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14927558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com