`method_missing': `build` 在示例组中不可用(例如 `describe` 或 `context` 块)
`method_missing': `build` is not available on an example group (e.g. a `describe` or `context` block)
我想在每次创建用户时删除 FactoryGirl.build(:user)
,所以我添加了这些行:
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
到spec_helper.rb
。但这会产生以下错误:
`method_missing': `build` is not available on an example group (e.g. a `describe` or `context` block). It is only available from within individual examples (e.g. `it` blocks) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). (RSpec::Core::ExampleGroup::WrongScopeError)
然后我删除了所有 context/describe 块,但这并没有改变任何东西。你们中有人遇到过同样的问题吗?我该如何解决?
目前我的测试是这样的:
require 'rails_helper'
RSpec.describe User, type: :model do
user = build(:user)
project = build(:project)
it "is valid with a firstname, lastname, email and password" do
expect(user).to be_valid
end
it "is invalid without a firstname" do
user = build(:user, name: nil)
expect(user.valid?).to be_falsey
expect(user.errors[:name].size).to eq(1)
end
it "is invalid without a lastname" do
user = build(:user, surname: nil)
expect(user.valid?).to be_falsey
expect(user.errors[:surname].size).to eq(1)
end
it "destroys dependent projects" do
user = User.create!(name: 'john', surname: 'doe', email: 't@example.com', password: 'password', password_confirmation: 'password')
user.projects << project
expect{user.destroy}.to change {Project.count}.by(-1)
end
end
而不是:
user = build(:user)
project = build(:project)
做:
let(:user) { build(:user) }
let(:project) { build(:project) }
一般来说,定义外部变量以在测试中使用它们并不是一个好主意,因为这可能会使您的测试依赖于顺序并且极难调试。始终使用 let
语法,以便为每个测试重新初始化值。
我想在每次创建用户时删除 FactoryGirl.build(:user)
,所以我添加了这些行:
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
到spec_helper.rb
。但这会产生以下错误:
`method_missing': `build` is not available on an example group (e.g. a `describe` or `context` block). It is only available from within individual examples (e.g. `it` blocks) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). (RSpec::Core::ExampleGroup::WrongScopeError)
然后我删除了所有 context/describe 块,但这并没有改变任何东西。你们中有人遇到过同样的问题吗?我该如何解决?
目前我的测试是这样的:
require 'rails_helper'
RSpec.describe User, type: :model do
user = build(:user)
project = build(:project)
it "is valid with a firstname, lastname, email and password" do
expect(user).to be_valid
end
it "is invalid without a firstname" do
user = build(:user, name: nil)
expect(user.valid?).to be_falsey
expect(user.errors[:name].size).to eq(1)
end
it "is invalid without a lastname" do
user = build(:user, surname: nil)
expect(user.valid?).to be_falsey
expect(user.errors[:surname].size).to eq(1)
end
it "destroys dependent projects" do
user = User.create!(name: 'john', surname: 'doe', email: 't@example.com', password: 'password', password_confirmation: 'password')
user.projects << project
expect{user.destroy}.to change {Project.count}.by(-1)
end
end
而不是:
user = build(:user)
project = build(:project)
做:
let(:user) { build(:user) }
let(:project) { build(:project) }
一般来说,定义外部变量以在测试中使用它们并不是一个好主意,因为这可能会使您的测试依赖于顺序并且极难调试。始终使用 let
语法,以便为每个测试重新初始化值。