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 指定 Voiceinvalid_voice 工厂的关联 class 并且因为您已经有了 Voice class 出现在您的代码中。