无法访问RSpec请求规范

时间:2016-01-11 18:15:43

标签: ruby-on-rails ruby rspec

我在我的gemfile中有这个:

group :development, :test do
  gem 'byebug'
  gem 'rspec-rails', '~>3.0' 
  gem 'rspec-its'
  gem 'factory_girl_rails'
  gem 'json_spec'
  gem "rspec_json_schema_matcher"
  gem 'faker'
end

我在spec/request/posts/show_spec.rb中有此请求规范:

require 'rspec/its'
require 'spec_helper'
require 'rails_helper'
RSpec.describe 'GET /posts/:id', :type => :request do

  let(:user) {create(:user)}
  let(:guest) {create(:user, :as_guest)}
  let(:post) {create(:post)}
  let(:id) {post.id}

  before(:each) {get "/posts/#{id}"}

  context "when the post exists" do
    expect(response).to have_http_status(:success)
  end

  context 'when a post is not found with the ID' do
    let(:id) {-1}
    expect(response).to have_http_status(:not_found)
  end

end

当我运行bundle exec rspec时,我收到此错误:

undefined local variable or method `response' for #<Class:0x00000002016470> (NameError)

我做错了什么?

2 个答案:

答案 0 :(得分:2)

  

response在示例组(例如describecontext块)上不可用。它只能从单个示例(例如it块)或在示例范围内运行的构造(例如beforelet等)中获得。 (RSpec的::核心:: ExampleGroup :: WrongScopeError)

更改

context "when the post exists" do
  expect(response).to have_http_status(:success)
end

context "when the post exists" do
  it 'status code is 200'
    expect(response).to have_http_status(:success)
  end
end

或者,甚至更短,看到您使用its

context "when the post exists" do
  its(:response) { is_expected.to have_http_status(:success) }
end

PS:当您将代码作为controller规范运行时,会出现上述错误。出于某种原因,使用request类型运行它会引发更少描述性错误。

答案 1 :(得分:1)

稍微捎带答案的评论,但每次设置新环境时我都遇到过这些问题。即便如此,我还有一系列规则来跟踪此类问题

在确保为测试获得正确的帮助时,需要检查以下三项内容:

  1. 如果您使用infer_spec_type_from_file_location!选项忽略类型元数据的需要,请确保您的folder names are named or pluralized correctly以及您的规范文件所在您要访问的功能的正确文件夹。

  2. 如果问题存在于您的规范位于正确的文件夹中,或者您在最顶层的描述块中使用类型元数据,那么您在某处缺少必需的模块(就像OP在他们的rails_helper中错过了&rs; rspec / rails&#39;)。仔细检查您的rails / spec_helper文件,并确保 .rspec文件规范文件中需要rails_helper。

  3. 最后,如果您缺少来自包含模块的功能,该模块需要的次数超出要求并且您已看到已包含,请确保将其设置为正确的规格类型。的 e.g。设计可以选择设置类型的测试模块(类型::控制器)

    一个。如果是这种情况,并且您需要其中一个基于类型的包含来涵盖多种规范类型,请在第二种类型设置为其类型的情况下再次包含该类型,或者如果您不喜欢,则完全删除该类型#39; t关心你的测试速度。

  4. 我希望有助于某人在将来找出问题。