我在我的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)
我做错了什么?
答案 0 :(得分:2)
response
在示例组(例如describe
或context
块)上不可用。它只能从单个示例(例如it
块)或在示例范围内运行的构造(例如before
,let
等)中获得。 (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)
稍微捎带答案的评论,但每次设置新环境时我都遇到过这些问题。即便如此,我还有一系列规则来跟踪此类问题。
在确保为测试获得正确的帮助时,需要检查以下三项内容:
如果您使用infer_spec_type_from_file_location!
选项忽略类型元数据的需要,请确保您的folder names are named or pluralized correctly以及您的规范文件所在您要访问的功能的正确文件夹。
如果问题存在于您的规范位于正确的文件夹中,或者您在最顶层的描述块中使用类型元数据,那么您在某处缺少必需的模块(就像OP在他们的rails_helper中错过了&rs; rspec / rails&#39;)。仔细检查您的rails / spec_helper文件,并确保 .rspec文件或规范文件中需要rails_helper。
最后,如果您缺少来自包含模块的功能,该模块需要的次数超出要求并且您已看到已包含,请确保将其设置为正确的规格类型。的 e.g。设计可以选择设置类型的测试模块(类型::控制器)
一个。如果是这种情况,并且您需要其中一个基于类型的包含来涵盖多种规范类型,请在第二种类型设置为其类型的情况下再次包含该类型,或者如果您不喜欢,则完全删除该类型#39; t关心你的测试速度。
我希望有助于某人在将来找出问题。