异步行为的断言

时间:2011-11-26 05:16:23

标签: rspec

在GOOS [1]中,他们使用一个名为assertEventually的断言进行采样 成功状态的系统,直到超过某个超时。这个 允许您使用异步代码同步测试。

我们已经在Ruby / RSpec世界中拥有相同的功能吗?一世 知道capybara有wait_until {},但这是相当简陋的 - 失败消息不是很有帮助。还有其他什么吗? 有?

[1] http://www.growing-object-oriented-software.com/

2 个答案:

答案 0 :(得分:2)

不确定。 “wait_for”是Brian Takita和我最初写的方法 用于Selenium测试,然后IIRC使它成为Selenium宝石和 现在很多图书馆使用它(或他们自己的版本 - 我没有专利 投票索赔:-))。我记得的wait_for允许你 自定义失败消息。让我去看看它是否在GitHub或 什么...

啊,这是一个: https://github.com/pivotal/selenium/blob/master/lib/selenium/wait_for.rb

答案 1 :(得分:0)

将此功能添加到代码

def wait_for
  timeout = 3
  start = Time.now
  x = yield
  until x
    if Time.now - start > timeout
      raise "Wait to long here. Timeout #{timeout} sec"
    end
    sleep(0.1)
    x = yield
  end
end

然后在每次需要等待异步时使用

  client.check_mail
  wait_for do
    !client.envelope.nil?
  end
  expect(client.envelope.message['sender']).to eq 'Subzero'

通过异步调用填充数据的示例信封