2014-02-14 3 views
1

Я использую видеомагнитофон с RSpec для тестирования тестового раздела кода API, и я сделал небольшой вызов.Как узнать, находится ли видеомагнитофон в режиме записи или воспроизведения?

В моем клиентском коде используется sleep для запросов API ограничения скорости. Благодаря this elegant solution, теперь я могу перехватить sleep сообщений с заглушкой из моих модульных тестов:

expect(subject).to receive(:sleep) 

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

Что [Я думаю] Я хочу сделать что-то вроде следующего:

expect(subject).to receive(:sleep) if !vcr.real_request? 

Так что я не вмешиваюсь с субъектами sleep, когда я записи кассету.

Я вижу интересный related discussion, но это похоже на другой случай, и я не вижу, как я могу использовать его напрямую. Тем не менее, это привело меня к обнаружению видеомагнитофонов (особенно before_playback), но мне не ясно, как я буду экспортировать subject в область действия блока или выполнить выполнение прокси-блока в область моего теста, чтобы сделать заглушку.

Любые мысли?

NB: Я использую функцию config.configure_rspec_metadata! в моих spec_helper.rb для автоматического захвата/имя моих кассет, если это делает никакой разницы (т.е. я не оборачивать каждый отдельный метод API явно в своем блоке VCR).

ответ

5

Оказалось, что это возможно без каких-либо обманов.

По this Google Groups thread:

Вы можете использовать VCR.http_stubbing_adapter.http_connections_allowed?

Однако (как описано автором) этот метод не публично задокументированы, и (как автор точно предсказана) не доступен в кодовой строке 2.x. Однако это заставило меня пересмотреть источник видеомагнитофона прямо из смеси любопытства и отчаяния. Я нашел следующее в lib/vcr.rb:294:

def real_http_connections_allowed? 
    return current_cassette.recording? if current_cassette 
    !!(configuration.allow_http_connections_when_no_cassette? || @turned_off) 
    end 

current_cassette.recording? С является общедоступным, он делает именно то, что мне нужно без взлома:

expect(subject).to receive(:sleep) if !VCR.current_cassette.recording? 
+1

Я использую видеомагнитофон 2.9.3 и видеомагнитофон :: Cassette. запись? только действительно работает, если record_mode: один раз. – pduey