在特征场景中使用带有Rspec的VCR

时间:2015-03-09 21:09:19

标签: ruby-on-rails ruby rspec rspec2 vcr

我有一个Rails 4应用程序,它使用自定义身份验证gem,根据第三方API对用户进行身份验证。该应用程序需要对网站上的大多数操作进行身份验证(访问者可以做很少的事情)。

我正在尝试使用VCR来记录在所有集成测试的身份验证期间所做的api请求,但我在SO和Relish文档中找到的所有示例仅涵盖了如何在&#39中使用Rspec执行此操作;描述做' spec,如下所述:

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

由于没有客户参与此项目,我正在使用Rspec和Capybara而不是Cucumber编写集成测试,因此我的测试使用了'功能/方案'格式如下:

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>

我按照文档在我的spec / rails_helper.rb中设置了VCR(spec / spec_helper.rb包含了它)......基本上看起来像这样:

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

显然添加了宝石&#39; vcr&#39;到我的Gemfile开发/测试组,它是在一个测试内部的console和binding.pry中的东西。

有没有人在Rspec功能中使用VCR?或者对我可以做什么作为解决方法有任何建议?

提前致谢

1 个答案:

答案 0 :(得分:4)

解决方案:Taryn East让我找到了解决方案,但它与任何试图继续前进的人发布的链接略有不同。

这是spec / rails_helper.rb或spec / 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标记。

在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令牌。

在VCR响应中,它的存储方式不同,只能按以下方式存储:

resp.headers["Oauth-Token"]

这很奇怪,但可行。这可能是VCR的一个错误或Excon的一些问题...太忙了,无法立即解决这个问题,但只是一个抬头以防其他人使用此设置并通过实时http请求和失败进行通过测试使用VCR录像带时进行测试。一个快速的解决方法是更改​​VCR磁带数据以匹配您的代码期望,或修改您的代码以接受任何可用值。