Утверждения для асинхронного поведения - PullRequest
3 голосов
/ 26 ноября 2011

В GOOS [1] они используют утверждение assertEventually, какие образцы система для успешного состояния до истечения определенного времени ожидания. это позволяет синхронизировать тесты с асинхронным кодом.

Есть ли у нас аналог этого в мире Ruby / RSpec? я знаю, что у капибары есть wait_until {}, но это довольно элементарно - сообщение об ошибке не очень полезно. Есть ли что-нибудь еще уже есть

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

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Конечно.«wait_for» - это метод, который Брайан Такита и я изначально написали для использования в тестах Selenium, затем IIRC превратил его в драгоценный камень Selenium, и теперь многие библиотеки используют его (или свою собственную версию - я не претендую на патент при опросе: -)).Ожидание, которое я помню, позволило вам настроить сообщение об ошибке.Позвольте мне посмотреть, на GitHub или что-то в этом роде ...

А, вот один из них: https://github.com/pivotal/selenium/blob/master/lib/selenium/wait_for.rb

1 голос
/ 02 августа 2015

Добавьте эту функцию к коду

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'

В примере конверт заполнен данными асинхронным вызовом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...