#ruby #rspec #capybara
#ruby #rspec #capybara
Вопрос:
Использование Rspec и Capybara после недавнего добавления удаления на большинство моих страниц тест теперь завершается случайным сбоем.
Сейчас локально они проходят нормально, но в Semaphore 2.0 я получаю случайные сбои в более коротких тестах.
Мы используем WebMock для заглушки запроса в remoteFetch(), и, похоже, это устраняется в более коротких тестах. Поскольку это вызывается впоследствии, заглушка не существует, и тест завершается неудачей
function debouncedFetch(ids) {
store.idsToFetch.push(ids);
$timeout.cancel(store.fetchTimeoutFn);
store.fetchTimeoutFn = $timeout(() => { remoteFetch(store.idsToFetch); }, 200);
}
Я попытался установить время отмены / тайм-аута равным 0, по-прежнему безрезультатно.
Есть ли способ проверить, завершены ли тесты / rootscope, уничтожены ли они или что-то еще, и не запускать функцию remoteFetch.
Или заставляем тест ждать запуска этой функции
Комментарии:
1. Пожалуйста, покажите пример неудачного теста и сообщение об ошибке
2. Привет, тесты завершаются неудачей, сообщая WebMock::NetConnectNotAllowedError: Поскольку он не может найти макет, который был настроен при запуске, WebMock после каждого из них включает хук, который вызывает reset, удаляя макет. Но затем запрос выполняется, поскольку он задерживается. Это не всегда завершается сбоем, и локально никогда! только на CI
Ответ №1:
Предполагая, что вы используете конфигурацию Capybara по умолчанию, в которой Capybara управляет запуском тестируемого приложения, оно будет ожидать закрытия всех сетевых подключений во время тестового сброса в after
блоке. Поскольку вы очищаете свой WebMock в after
блоке, возможно, это происходит до того, как блок зарегистрирован Capybara. Чтобы исправить это, вы можете изменить порядок, в котором они определены, или определить очистку WebMock с помощью append_after
вместо after
, чтобы она гарантированно выполнялась после сброса сеанса Capybara.
Комментарии:
1. Поскольку веб-запрос должен выполняться по расписанию (в данном случае через 200 мс) после истечения времени ожидания, веб-запрос отсутствует / активен / активен. Ожидающий запрос является. Драгоценный камень WebMock — это тот, у которого есть хук after, мне нужно каким-то образом заставить его ждать ожидающую функцию / запрос, прежде чем rspec запустится после
2. @RuAware Итак, как показывает ваш ответ, мой ответ был правильным — вам нужно было исправить порядок, в котором были определены блоки.
3. Да, это именно тот способ, которым я хочу донести окончательное решение. Для того, чтобы сделать это. Ваша помощь помогла мне, я назначу вам награду, когда смогу
4. @RuAware хорошо — не забудьте выбрать ответ (
checkmark
), чтобы вопрос был отмечен как ответ
Ответ №2:
Оказывается, что after(each:) { WebMock.reset! }
как часть драгоценного камня вызывается перед Capybara.reset_sessions!
Это вызывает состояние гонки в коде. способ обойти это — изменить порядок и убедиться в вашем spec_helper, который require 'webmock/rspec'
вызывается перед require 'rspec/rails'
Это гарантирует, что порядок перехватов настроен в правильном порядке.
надеюсь, это поможет кому-то еще