2013-04-23 4 views
0

Мой VCR конфигурации является:Видеомагнитофон Обмен сообщениями между кассетами?

VCR.configure do |c| 
    c.configure_rspec_metadata! 
    c.cassette_library_dir = 'spec/cassettes' 
    c.hook_into :webmock 
    c.ignore_localhost = true 
end 

И тестовый пример:

it "creates a build", :vcr => {:cassette_name => "build/feature/create"} do 
    visit new_build_path(build) 

    fill_in("build_name", :with => "Test Build") 
    click_button("Create Build") 

    build = Build.first 

    page.should have_content("Build was successfully created.") 

    current_path.should == build_path(hub) 
end 

При выполнении этого теста он взывает к нескольким третьей партии API, который запрашивает регистрируются через видеомагнитофон. Проблема, с которой я сталкиваюсь, заключается в том, что, по-видимому, видеомагнитофон использует запросы от других кассет во время работы, что вызывает прерывистые сбои для определенных тестов. Я проверил кассеты, и иногда (в зависимости от того, как это выглядит) все запросы будут записаны и воспроизведены отлично. Стоит отметить, что это когда весь пакет запущен, они всегда работают, когда запускаются сами по себе. Я не разделяю кассеты между спецификациями, которые терпят неудачу, единственное, что разделяется, - это некоторые распространенные запросы к API, и я заставляю имена кассет только для того, чтобы убедиться, что они используют правильные. Я надеюсь, что это имеет смысл ...

Мой главный вопрос - что может быть причиной этой проблемы? При использовании record => :new_episodes тесты работают отлично, но не при использовании режима record => :once. Это может быть хорошо, учитывая ситуацию, но я хочу убедиться, что я не создаю ненужных запросов, и из моего понимания record => :once должен работать, учитывая, что запросы для каждой спецификации должны быть изолированы.

Я знаю, что это может быть трудно ответить без дополнительной информации, поэтому дайте мне знать, если кто-нибудь поможет. Заранее спасибо!

+0

Что это? Водосвинка? – pguardiario

+0

Да, я использую capybara и драйвер poltergeist для тестов на основе JS. –

+0

. Вы должны упомянуть об этом и пометить свой вопрос правильно или вы не получите хороший ответ. – pguardiario

ответ

0

Как вы уже сказали, трудно ответить из небольшого количества информации, которую вы указали. Однако я могу дать некоторые рекомендации по устранению неполадок.

  • Вы упомянули, что используете драйвер capibara JS. Драйверы Capybara JS являются асинхронными, что означает, что тестовый поток может продолжаться до того, как ваше приложение обработает конкретный запрос, поэтому, если тестовый скрипт продолжается и выгружает или вставляет новую кассету видеомагнитофона, а затем приложение делает HTTP-запрос - - это может привести к условиям гонки.
  • Видеомагнитофон имеет опцию debug_logger, которая даст вам много информации о том, что именно делает видеомагнитофон. Он может ответить на ваш вопрос.

Удачи вам!

+0

Майрон, спасибо за предложения. Более странная вещь заключается в том, что я изолировал проблему до файла спецификации, который не имеет тестов JS. Возможно ли, что спецификация B, использующая кассету B, может использовать запросы из кассеты A из спецификации A? Я понимаю, что это не должно быть так, но из debug_logger и поведения, похоже, так. Чтобы уточнить еще один пример, запуск spec сам по себе записывает правильные запросы каждый раз, но выполнение spec a + spec b приведет к тому, что spec b пропустит некоторые запросы, которые перекодируются в spec a. Если больше информации, которая может помочь, дайте мне знать. Спасибо! –

+0

«Возможно ли, что спецификация B, использующая кассету B, может использовать запросы из кассеты A из спецификации A?" Что-то возможно, я полагаю (программное обеспечение сложное, в конце концов), но я не могу представить, как это может происходить, учитывая, как работает VCR. Каждая кассета по существу представляет собой песочницу, изолированную от других кассет. Есть одно исключение: вы можете вставлять кассеты, и если запрос не соответствует внутренней кассете, он будет выглядеть в внешней кассете для ответа. Итак, если кассета каким-то образом не выбрасывается из спецификации A, то это может привести, я думаю. –

+0

Обновление: Еще более странно, что я заметил, что наблюдение за журналом отладки заключается в том, что при запуске Spec A + Spec B запрос, который, как я думал, разделялся ранее, на самом деле не был сделан (или, по крайней мере, не был захвачен видеомагнитофоном, если это так, Я не думаю, что это так), но при запуске Spec B сам по себе запрос сделан ... Поэтому запрос не захватывается из другой кассеты, на самом деле он никогда не записывается и не записывается, а при повторном запуске после записи кассет так что видеомагнитофон выбрасывает необработанную ошибку запроса. Я затрудняюсь с этим ха-ха ... –

Смежные вопросы