2015-03-09 4 views
0

У меня есть приложение Rails 4, в котором используется настраиваемый камень для проверки подлинности, который аутентифицирует пользователей в отношении стороннего API. Приложение требует проверки подлинности для большинства действий на сайте (посетители могут делать очень мало).с использованием видеомагнитофона с Rspec в сценариях функций

Я пытаюсь использовать видеомагнитофон для записи запроса api, сделанного во время аутентификации, для всех тестов интеграции, но все примеры, которые я могу найти в SO и в документации Relish, охватывают только то, как это сделать с помощью Rspec в описании делать»спецификации, как указано здесь:

https://www.relishapp.com/vcr/vcr/v/1-6-0/docs/test-frameworks/usage-with-rspec

поскольку ни клиенты не участвуют в этом проекте, я пишу тесты интеграции с Rspec и Капибарой вместо огурца, так что мои тесты с помощью„функции/сценария“ формат такой:

feature 'posts' do 
    scenario 'a user can log in' do 
    # use vcr for api request 
    sign_in_user # refers to a method that handles the api call to log in a user, which is what I would like VCR to record. 
    expect(page).to have_content("User signed in successfully") 
    end 
end 

Используя команду, описанную в документации:

use_vcr_cassette 

внутри блока «сценария», возвращает ошибку:

Failure/Error: use_vcr_cassette 

undefined local variable or method `use_vcr_cassette' for #<RSpec::ExampleGroups::Posts:0x007fb858369c38> 

Я следовал документацию установки видеомагнитофона в моей спецификации/rails_helper. гь (который входит в спецификации/spec_helper.rb) ... который в основном выглядит следующим образом:

require 'vcr' 
VCR.configure do |c| 
    c.cassette_library_dir = 'support/vcr_cassettes' 
    c.hook_into :webmock 
end 

Очевидно добавлен драгоценный камень «Видеомагнитофон» моей Gemfile де velopment/test group, и это вещь в консоли и binding.pry изнутри теста.

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

Заранее спасибо

+0

Это очень устаревшая версия видеомагнитофона, которую я угадываю, это не то, что спутник снес. Взгляните на более свежие примеры здесь: https://www.relishapp.com/vcr/vcr/v/2-9-3/docs – Anthony

+1

Я не настроил видеомагнитофон, но наши тесты имеют это: 'feature ' posts ",: vcr do' (и есть некоторая конфигурация) ... но это просто автоматически создает кассеты с видеомагнитофоном, названные в честь сценария spec + –

+0

Похоже, что это может быть то, что у нас есть для нашей системы: http: // www .Shaunambrose.com/2012/03/19/automatic-vcr-cassette-naming-for-rspec-and-oucumber/ –

ответ

2

Решение: Taryn Восток получил меня к решению, но он немного отличается от ссылки, публикуемую для тех, кто пытается сделать это движение вперед.

здесь является самой основной конфигурации в спецификации/rails_helper.rb или спецификации/spec_helper.rb:

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

с использованием c.configure_rspec_metadata! требуется для Rspec для обработки тега: vcr.

И в Feature спецификации RSpec:

feature 'users' do 
    scenario 'logged in users should be able to do stuff', :vcr do 
    # authenticate user or make other http request here 
    end 
end 

Как ни странно, в моих тестах - видеомагнитофон записывает ответ и если проходит в первый раз, но терпит неудачу во второй раз. Я проследил это, чтобы ответ хранился иначе, чем он был получен.

На обычном запросе (с помощью EXCON) следующим образом:

resp = Excon.post(url, :body => data, :headers => { "Content-Type" => "application/x-www-form-urlencoded", "Authorization" => authorization_header }) 

Ответ имеет заголовок, который доступен в следующем формате:

resp.headers["oauth_token"] 

который возвращает маркер OAuth.

В ответ на видеомагнитофон, он хранится по-разному и только доступны как:

resp.headers["Oauth-Token"] 

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