Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么水豚特征测试不';我等不及了?_Ruby On Rails_Capybara_Integration Testing - Fatal编程技术网

Ruby on rails 为什么水豚特征测试不';我等不及了?

Ruby on rails 为什么水豚特征测试不';我等不及了?,ruby-on-rails,capybara,integration-testing,Ruby On Rails,Capybara,Integration Testing,我的测试套件有一个小问题:当我在页面上运行检查ajax操作的规范时,有时会出现随机错误 Failure/Error: expect(page).to have_content 'DHH' 这个错误很少出现(大约1/100),但这让我很困惑。我决定这是一个“竞争条件”原因,并在我的spec/rails\u helper.rb Capybara.default_max_wait_time = 10 但这对我没有帮助,我决定添加时间戳 it 'adds new DHH', js: true d

我的测试套件有一个小问题:当我在页面上运行检查ajax操作的规范时,有时会出现随机错误

Failure/Error: expect(page).to have_content 'DHH'
这个错误很少出现(大约1/100),但这让我很困惑。我决定这是一个“竞争条件”原因,并在我的
spec/rails\u helper.rb

Capybara.default_max_wait_time = 10
但这对我没有帮助,我决定添加时间戳

  it 'adds new DHH', js: true do
    find('#modal_new_dhh').click
    fill_in('name', with: 'DHH')

    p 'click button'
    p Time.now.strftime('%H:%M:%S.%L')
    click_button('Submit')

    p 'checking content'
    p Time.now.strftime('%H:%M:%S.%L')
    expect(page).to have_content 'DHH'

    p 'after checking content'
    p Time.now.strftime('%H:%M:%S.%L')
  end
看到了吗

"click button"
"17:34:43.083"
"before checking content"
"17:34:43.127"
"after checking content"
"17:34:43.213"
为什么水豚不在点击按钮后等待


对不起,我的英语不好,你说这是比赛条件。至于为什么会这样,我真的不能说,我能想到的唯一原因是用户体验和自动化测试之间存在差异,因为计算机速度非常快


不久前,我曾面临同样的挑战,我发现这为我找到了解决此类问题的方法。我希望它对您也有用。

您的示例中的等待发生在have\u content matcher中。当您从中输出时间时,将不会显示延迟,因为单击按钮无需等待,它只需单击按钮并继续(因为它不知道等待什么,单击按钮可以做任何事情),但是have_content matcher将等待至Capybara.default_max_wait_time以显示内容


注意您的
查找
,“填写”和
单击按钮
呼叫也会在执行操作之前等待相关元素出现

谢谢您的回答,我以前使用过它,但我想知道-为什么水豚不在单击后等待button@vear因为点击一个按钮可以做任何事情(或者什么都不做)所以,没有办法知道该等什么——水豚会等你告诉它找到什么东西的时候。嗨,汤姆!顺便说一句,我已经在github上阅读了now发行版,您在其中标记:)您现在说
have\u content
matcher应该等待Capybara.default\u max\u wait\u time,但这对我不起作用。我更新了question@vear很好,重要的是要认识到水豚只能等待它知道要等待的事情。当您告诉它单击某个按钮时,它知道在单击按钮之前要等待按钮出现(因此它是可单击的),但不知道单击该按钮的结果是什么,因此不知道单击后要等待什么。@vear什么使您认为它没有等待?它会等待到Capybara.deafult_max_wait_time,但当页面上有“DHH”时,它会更快地返回-因此,要么你的应用程序已返回更新页面,要么你正在检查初始页面上已有的内容(确保您正在检查仅在单击按钮执行的任何操作完成后才显示在页面上的内容)@vear是的,我现在明白了