我有一个带有导轨后端的单页角应用程序。页面上有链接触发状态转换(导航到页面),这些toStates抛出一个微调器,因为后台有一个api调用。最初,测试结果令人难以置信,因为有时api调用会立即发生,有时会有一点延迟,而且水豚会在实际存在之前断言页面上有东西。
为了解决这个问题,我做了这个,以便我的测试环境有一个硬编码的微调器延迟,导致所有api调用微调器持续至少1000ms。
所以,我做了一个capybara帮助方法让我知道测试应该向前推进,断言实际上是在页面上的东西并准备好进行测试:
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, k As Integer
With Me.ListBox1
.ColumnCount = 10
.ColumnWidths = "15;15;15;15;15;15;15;15;15;15"
k = 10 ' determines exit condition
For i = 1 To 10
For j = 1 To 10
If j = 1 Then
.AddItem j ' if it is the number 1, use AddItem method
Else
.List(.ListCount - 1, j - 1) = j ' else use the List method
End If
If k = j Then Exit For
Next
k = k - 1
Next
End With
End Sub
所以我可以这样做:
def with_spinner_expectations
expect(page).to_not have_selector('.spinner')
yield
expect(page).to have_selector('.spinner')
expect(page).to_not have_selector('.spinner')
end
所以,测试会期望没有微调器,然后单击元素将转换到新状态,并在该状态的控制器初始化时,进行api调用 - 显示微调器,然后在1秒后,它消失了。
然而,每运行5-10个规格,就会失败,说没有选择器' .spinner' .........
我甚至遇到过这样的问题,我每次都会访问一个引发微调器的网址。
with_spinner_expectations
page.find('.thing-that-triggers-a-state-change').click
end
......它会在大部分时间内通过,但每隔一段时间,它就会失败,声称没有旋转器。
如果有人可以帮助指导我如何使这些测试不那么脆弱,我将非常感激。
答案 0 :(得分:0)
我在一个角色应用程序中工作,该应用程序在api调用期间也使用微调器并使用类似这样的方法:
def check_page_done
begin
(0..30).each do |i|
if page.has_css?('#loading-bar-spinner', :wait => 2) then sleep 2 else break end
puts 'Loading spinner never finished' if i == 30
end
rescue Exception => msg
puts msg
retry
end
end
该方法将等待2秒钟以显示微调器,然后继续前进。如果确实找到了加载微调器,它会等待另一个旋转器。如果微调器只是继续运行一整分钟,那么我们就会断开,所以我们不会无限期地卡住。
异常处理就在那里,因为有时我遇到了可怕的陈旧元素异常,在这种情况下很容易被忽略,因为我们只是处理一个微调器。
我在许多其他辅助方法中使用此方法,以及在我知道常规水豚探测器可能不够的步骤之间。
您是否也尝试过观看实际的测试执行?也许旋转器确实不会经常出现。