3

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

我正在尝试使用 VCR 记录在所有集成测试的身份验证期间发出的 api 请求,但我可以在 SO 和 Relish 文档中找到的所有示例仅涵盖如何在“描述执行”规范中使用 Rspec 执行此操作,如此处所引用:

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 (包含在 spec/spec_helper.rb 中)中设置了 VCR ......基本上看起来像这样:

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

显然,将 gem 'vcr' 添加到了我的 Gemfile 开发/测试组中,它是控制台和 binding.pry 中的一个测试内部的东西。

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

提前致谢

4

1 回答 1

5

解决方案: 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

奇怪的是,在我的测试中 - VCR 正在记录响应,如果第一次通过,但第二次失败。我将此追溯到存储的响应与接收到的响应不同。

在正常请求(使用 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 磁带数据以匹配您的代码所期望的,或者修改您的代码以接受任一可用值。

于 2015-03-10T16:02:51.370 回答