FactoryGirl 未初始化常量 InvalidVoice
FactoryGirl uninitialized constant InvalidVoice
遇到这个错误时正在尝试学习 RSpec 和 FactoryGirl。
Failure/Error: post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
NameError:
uninitialized constant InvalidVoice
下面是voice_controller
上的简单RSpec
describe '#create' do
context "with valid inputs" do
it "creates and increase Voice count by 1" do
expect{
post :create, voice: FactoryGirl.attributes_for(:voice)
}.to change(Voice, :count).by(1)
end
it "redirects to show page" do
post :create, voice: FactoryGirl.attributes_for(:voice)
expect(response).to redirect_to Voice.last
end
end
context "with invalid inputs" do
it "does not increase Voice count" do
expect{
post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
}.not_to change(Voice, :count)
end
it 'renders #new again' do
post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
expect(response).to render_template :new
end
end
end
现在,所有 context "with valid inputs" do 都会通过。然而,在 with invalid inputs 上下文中,FG 似乎没有将 :invalid_voice 注册为有效输入。
这是我的 FG
FactoryGirl.define do
factory :voice do
title "MyString"
opinion "MyText"
end
factory :invalid_voice do
title ""
opinion ""
end
end
对于此项目,无效输入仅表示空输入。因此,如果标题或意见为空,则它是无效的,应该 return 一个错误/重定向到 new 方法。
我尝试将“”设置为 nil 并完全删除其中一个属性,但错误仍然存在。
我做错了什么?
编辑:
看来以下工作。但是有人可以告诉我为什么吗?
factory :invalid_voice, parent: :voice do
title nil
end
factory :invalid_voice, parent: :voice do
title nil
end
之所以可行,是因为当您将 voice
定义为 invalid_voice
的父级时,这意味着 invalid_voice
继承自 voice
,并且是 [=12] 的一种=].
没有这个,它就无法工作并出现此错误:
NameError:
uninitialized constant InvalidVoice
因为,您的代码中没有任何名为 InvalidVoice
的 class。但是,你只有 Voice
class.
您可以使用 Inheritence
为同一个 class 创建多个工厂。而且,您正在为一个 class Voice
.
创建两个工厂 :voice
和 :invalid_voice
这就是您要执行的操作:factory :invalid_voice, parent: :voice
指定 Voice
是 invalid_voice
工厂的关联 class 并且因为您已经有了 Voice
class 出现在您的代码中。
遇到这个错误时正在尝试学习 RSpec 和 FactoryGirl。
Failure/Error: post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
NameError:
uninitialized constant InvalidVoice
下面是voice_controller
上的简单RSpecdescribe '#create' do
context "with valid inputs" do
it "creates and increase Voice count by 1" do
expect{
post :create, voice: FactoryGirl.attributes_for(:voice)
}.to change(Voice, :count).by(1)
end
it "redirects to show page" do
post :create, voice: FactoryGirl.attributes_for(:voice)
expect(response).to redirect_to Voice.last
end
end
context "with invalid inputs" do
it "does not increase Voice count" do
expect{
post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
}.not_to change(Voice, :count)
end
it 'renders #new again' do
post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
expect(response).to render_template :new
end
end
end
现在,所有 context "with valid inputs" do 都会通过。然而,在 with invalid inputs 上下文中,FG 似乎没有将 :invalid_voice 注册为有效输入。
这是我的 FG
FactoryGirl.define do
factory :voice do
title "MyString"
opinion "MyText"
end
factory :invalid_voice do
title ""
opinion ""
end
end
对于此项目,无效输入仅表示空输入。因此,如果标题或意见为空,则它是无效的,应该 return 一个错误/重定向到 new 方法。
我尝试将“”设置为 nil 并完全删除其中一个属性,但错误仍然存在。
我做错了什么?
编辑:
看来以下工作。但是有人可以告诉我为什么吗?
factory :invalid_voice, parent: :voice do
title nil
end
factory :invalid_voice, parent: :voice do
title nil
end
之所以可行,是因为当您将 voice
定义为 invalid_voice
的父级时,这意味着 invalid_voice
继承自 voice
,并且是 [=12] 的一种=].
没有这个,它就无法工作并出现此错误:
NameError:
uninitialized constant InvalidVoice
因为,您的代码中没有任何名为 InvalidVoice
的 class。但是,你只有 Voice
class.
您可以使用 Inheritence
为同一个 class 创建多个工厂。而且,您正在为一个 class Voice
.
:voice
和 :invalid_voice
这就是您要执行的操作:factory :invalid_voice, parent: :voice
指定 Voice
是 invalid_voice
工厂的关联 class 并且因为您已经有了 Voice
class 出现在您的代码中。