Rspec FactoryGirl未初始化常量InvalidVoice

Rspec FactoryGirl未初始化常量InvalidVoice,rspec,factory-bot,Rspec,Factory Bot,当我遇到这个错误时,我正在努力学习RSpec和FactoryGirl Failure/Error: post :create, voice: FactoryGirl.attributes_for(:invalid_voice) NameError: uninitialized constant InvalidVoice 下面是语音控制器上的一个简单RSpec describe '#create' do context "with valid input

当我遇到这个错误时,我正在努力学习RSpec和FactoryGirl

Failure/Error: post :create, voice: FactoryGirl.attributes_for(:invalid_voice)
     NameError:
       uninitialized constant InvalidVoice
下面是语音控制器上的一个简单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
现在,所有带有有效输入的上下文都将通过。然而,在具有无效输入的上下文中,FG似乎没有将:invalid_voice注册为有效输入

这是我的前景

FactoryGirl.define do
  factory :voice do
    title "MyString"
    opinion "MyText"
  end

  factory :invalid_voice do
    title ""
    opinion ""
  end

end
对于这个项目,无效输入仅仅意味着空输入。因此,如果title或opinion为空,则它是无效的,应该返回一个错误/重定向到new方法

我尝试将“”设置为nil并完全删除其中一个属性,但错误仍然存在

我做错了什么

编辑:

看来下面的方法是有效的。有人能告诉我为什么吗

factory :invalid_voice, parent: :voice do
    title nil
  end
这是因为,当您将
语音
定义为
无效语音
的父项时,这意味着
无效语音
继承自
语音
,是一种
语音

如果没有此选项,它将无法工作,并出现以下错误:

 NameError:
   uninitialized constant InvalidVoice
因为,您的代码中没有任何名为
InvalidVoice
的类。但是,您只有
语音

您可以使用
继承
为同一类创建多个工厂。并且,您正在为一个类创建两个工厂
:voice
:invalid_voice


这就是您要做的:
factory:invalid_voice,parent::voice
指定
voice
invalid_voice
工厂的关联类,它的工作原理是,您的代码中已经存在一个
voice
类。

我在回答中解释了原因。请看一看,如果你有任何其他问题,请告诉我。我明白了,所以似乎所有的工厂都必须与模型相关。谢谢
 NameError:
   uninitialized constant InvalidVoice