Выполнить спецификации с видеомагнитофоном без явного указания названия кассеты - PullRequest
4 голосов
/ 22 января 2020

У меня есть технические характеристики капибары, которые я собираюсь запустить без явного указания имени кассеты. Например:

  scenario "by searching via a title" do
    visit root_path

    fill_in "search", with: "cheddar"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddar/)
  end
  scenario "by searching via a description" do
    visit root_path

    fill_in "search", with: "cheddar"
    select "Description", from: "search_field"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddars Are Scarce/)
  end

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

1 Ответ

0 голосов
/ 22 января 2020

В прошлом я обрабатывал что-то подобное, настраивая его из файла rails_helper.

В вашем блоке Rspec.configure вы можете получить подробную информацию о каждой запущенной функции c и изменить ее. вещи до, около или после запуска каждого примера spe c. Это позволило мне иметь хороший DSL, который позволяет мне указывать имя кассеты как тег vcr. Так что в вашем случае это может стать:

  scenario "by searching via a title", vcr: :search_title do
    visit root_path

    fill_in "search", with: "cheddar"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddar/)
  end
  scenario "by searching via a description", vcr: :search_description do
    visit root_path

    fill_in "search", with: "cheddar"
    select "Description", from: "search_field"
    find(".search-btn").click


    expect(page).to have_content(/White Cheddars Are Scarce/)
  end

Изменения, которые я должен был сделать, чтобы сделать эту работу, были в файле rails_helper:

RSpec.configure do |c|
  c.around(:each, :vcr) do |example|
    name = Array(example.metadata.dig(:vcr)).join
    options = example.metadata.slice(:record, :match_requests_on)
    VCR.use_cassette(name, options) { example.call }
  end
end

Для каждого задания * Пример 1017 * с тегом vcr, возьмите метаданные spe c и извлеките все, что хранится в теге vcr, в качестве имени кассеты. Остальные строки просто активируют видеомагнитофон только для спецификаций, имеющих тег VCR. Вы можете узнать больше о том, почему я сделал это из этого эпизода Railscast

...