Отключите видеомагнитофон для определенных характеристик

Как мне указать видеомагнитофону, что я хочу, чтобы он полностью игнорировал спецификационный файл?

Я прочитал сообщение в группах Google, в котором предлагается разрешить настоящие HTTP-запросы или явное отключение видеомагнитофона.

На мой взгляд, было бы гораздо полезнее, если бы видеомагнитофон не совал свой нос, если в спецификации нет тега метаданных :vcr. Я не хочу выключать и снова включать видеомагнитофон в before/after, так как не знаю, был ли он включен заранее. Я не хочу разрешать настоящие HTTP-запросы во всех спецификациях, а только в некоторых конкретных.

Есть ли способ сделать видеомагнитофон более избирательным?


person EngineerBetter_DJ    schedule 08.06.2015    source источник


Ответы (5)


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

describe "A group of specs where you want to allow http requests" do
  before do
    VCR.configure do |c|
      @previous_allow_http_connections = c.allow_http_connections_when_no_cassette?
      c.allow_http_connections_when_no_cassette = true
    end
  end

  after do
    VCR.configure do |c|
      c.allow_http_connections_when_no_cassette = @previous_allow_http_connections
    end
  end

  # Specs in this block will now allow http requests to be made

end

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

person Casey Davidson    schedule 02.05.2016

Конечно, в вашем блоке конфигурации добавьте:

VCR.configure do |c|
  c.allow_http_connections_when_no_cassette = true
end

Это, насколько мне известно, единственный вариант, который VCR имеет в отношении вашего набора тестов. См. документы. .

Скорее всего, вам действительно следует рассмотреть режимы записи для подобного поведения, чтобы оно было действенным.

person Anthony    schedule 08.06.2015
comment
Спасибо. Дело в том, что у меня есть одна спецификация, которую я хочу, чтобы видеомагнитофон игнорировал, и мой блок конфигурации находится в моем spec_helper.rb, который применяется ко всему. Любые предложения относительно лучшего способа ограничить эффект этой конфигурации только одной спецификацией? - person EngineerBetter_DJ; 08.06.2015
comment
Я бы переместил этот тег, который может включать spec_helper. - person Anthony; 25.03.2020

Основываясь на ответе Кейси, я придумал этот вспомогательный модуль:

module VcrHelpers
  def self.perform_without_cassette
    VCR.configure { |c| c.allow_http_connections_when_no_cassette = true }
    yield
  ensure
    VCR.configure { |c| c.allow_http_connections_when_no_cassette = false }
  end
end

Затем его можно вызвать из любой спецификации следующим образом:

VcrHelpers.perform_without_cassette do
 some_http_request
end
person KNejad    schedule 08.07.2020

В моем случае я не хотел разрешать настоящие HTTP-соединения для спецификаций, отличных от VCR, я просто хотел, чтобы VCR был отключен для этих спецификаций, чтобы вместо этого Webmock обрабатывал их напрямую. Вот что сработало для меня:

RSpec.configure do |config|
  config.around do |example|
    if example.metadata.key?(:vcr)
      example.run
    else
      VCR.turned_off { example.run }
    end
  end
end
person Jimbali    schedule 20.11.2020

Есть несколько методов, которые позволяют это сделать, вот некоторые ресурсы:

Что-то в этом роде может сработать:

# In the beginning of your describe block
around do |example|
  VCR.turned_off { example.run }
end

or

let(:request) { 
  VCR.turned_off do
    get some_path(params)
  end
end

it { expect { request } .to .... }

Возможно, вам придется использовать VCR.eject_cassette перед использованием метода выключения в зависимости от того, что вы делаете в своей спецификации.

person Allison    schedule 25.11.2020