Ruby on rails Rails:Rspec和FactoryGirl协会

Ruby on rails Rails:Rspec和FactoryGirl协会,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,我正在尝试为我的控制器编写测试,一切都很顺利,直到我尝试为关联模型(有很多,属于等等)编写测试。我尝试阅读FactoryGirl关于关联的入门指南,并尝试尽可能地遵循,但我遇到了如下错误: 1) GuestsController POST #create with valid attributes saves the guest to the database Failure/Error: post :create, guest: FactoryGirl.attributes_for(@gue

我正在尝试为我的控制器编写测试,一切都很顺利,直到我尝试为关联模型(有很多,属于等等)编写测试。我尝试阅读FactoryGirl关于关联的入门指南,并尝试尽可能地遵循,但我遇到了如下错误:

1) GuestsController POST #create with valid attributes saves the guest to the database
 Failure/Error: post :create, guest: FactoryGirl.attributes_for(@guest)
 ArgumentError:
   Factory not registered: #<Guest:0x007fb7b1171298>
主控主任:

...
has_many :guests
...
....
belongs_to :invite
...
...
  def create
    @invite = Invite.find(params[:invite_id])
    @guest = @invite.guests.create(guest_params)
    redirect_to edit_invite_path(@invite)
  end
...
邀请工厂:

FactoryGirl.define do
  factory :invite do |f|
    f.name { Faker::Name.name }
    f.invite_code { Faker::Number.number(4) }

    factory :invite_with_guests do
      transient do
        guests_count 5
      end

      after(:create) do |invite, evaluator|
        create_list(:guest, evaluator.guests_count, invite: invite)
      end
   end
 end
end
来宾工厂:

FactoryGirl.define do 
  factory :guest do |f|
    f.name { Faker::Name.name }
    f.attendance_status "yes"
    f.starter "Mushroom"
    f.main "Beef"
    f.dessert "Chicken"
    f.dietary_requirements { Faker::Lorem.words(4) }

    f.association :invite
  end
end
客户控制员:

...
has_many :guests
...
....
belongs_to :invite
...
...
  def create
    @invite = Invite.find(params[:invite_id])
    @guest = @invite.guests.create(guest_params)
    redirect_to edit_invite_path(@invite)
  end
...
来宾控制器规格:

...
describe "POST #create" do
  before :each do
    @invite = FactoryGirl.create(:invite_with_guests)
    @guest = @invite.guests.first
  end

  context 'with valid attributes' do
    it 'saves the guest to the database' do
      expect {
        post :create, guest: FactoryGirl.attributes_for(@guest)
      }.to change(Guest,:count).by(1)
    end
  end

  ...
end
...
谢谢你的帮助

编辑:

路线:

           Prefix Verb   URI Pattern                                   Controller#Action
    invite_guests GET    /invites/:invite_id/guests(.:format)          guests#index
              POST   /invites/:invite_id/guests(.:format)          guests#create
 new_invite_guest GET    /invites/:invite_id/guests/new(.:format)      guests#new
edit_invite_guest GET    /invites/:invite_id/guests/:id/edit(.:format) guests#edit
     invite_guest GET    /invites/:invite_id/guests/:id(.:format)      guests#show
                  PATCH  /invites/:invite_id/guests/:id(.:format)      guests#update
                  PUT    /invites/:invite_id/guests/:id(.:format)      guests#update
                  DELETE /invites/:invite_id/guests/:id(.:format)      guests#destroy
   lookup_invites GET    /invites/lookup(.:format)                     invites#lookup
          invites GET    /invites(.:format)                            invites#index
                  POST   /invites(.:format)                            invites#create
       new_invite GET    /invites/new(.:format)                        invites#new
      edit_invite GET    /invites/:id/edit(.:format)                   invites#edit
           invite GET    /invites/:id(.:format)                        invites#show
                  PATCH  /invites/:id(.:format)                        invites#update
                  PUT    /invites/:id(.:format)                        invites#update
                  DELETE /invites/:id(.:format)                        invites#destroy
        dashboard GET    /dashboard(.:format)                          invites#index
             root GET    /                                             info#index
编辑2:

我已经根据以下可能的答案更新了来宾控制器规范,它仍然失败

...
describe "POST #create" do
  before :each do
    @invite = FactoryGirl.create(:invite_with_guests)
    @guest = @invite.guests.first
  end

  context 'with valid attributes' do
    it 'saves the guest to the database' do
      expect {
        post :create, guest: @guest.attributes
      }.to change(Guest,:count).by(1)
    end

    it 'redirects the edit invite path'
  end

...
end
...
我得到以下错误:


属性\u for
接受一个符号,该符号返回可用于构建对象的属性

在你的情况下,你需要

expect {
  post :create, guest: @guest.attributes
}.to change(Guest,:count).by(1)
或定义
guest\u属性

let(:guest_attributes){ attributes_for(:guest) }
let(:guest) { create(:guest, guest_attributes) )
...
# create an invite where the first guest is your defined guest

expect {
  post :create, guest: guest_attributes
}.to change(Guest,:count).by(1)

attributes\u for
接受一个符号,该符号返回可用于构建对象的属性

在你的情况下,你需要

expect {
  post :create, guest: @guest.attributes
}.to change(Guest,:count).by(1)
或定义
guest\u属性

let(:guest_attributes){ attributes_for(:guest) }
let(:guest) { create(:guest, guest_attributes) )
...
# create an invite where the first guest is your defined guest

expect {
  post :create, guest: guest_attributes
}.to change(Guest,:count).by(1)

attributes\u for
接受一个符号,该符号返回可用于构建对象的属性

在你的情况下,你需要

expect {
  post :create, guest: @guest.attributes
}.to change(Guest,:count).by(1)
或定义
guest\u属性

let(:guest_attributes){ attributes_for(:guest) }
let(:guest) { create(:guest, guest_attributes) )
...
# create an invite where the first guest is your defined guest

expect {
  post :create, guest: guest_attributes
}.to change(Guest,:count).by(1)

attributes\u for
接受一个符号,该符号返回可用于构建对象的属性

在你的情况下,你需要

expect {
  post :create, guest: @guest.attributes
}.to change(Guest,:count).by(1)
或定义
guest\u属性

let(:guest_attributes){ attributes_for(:guest) }
let(:guest) { create(:guest, guest_attributes) )
...
# create an invite where the first guest is your defined guest

expect {
  post :create, guest: guest_attributes
}.to change(Guest,:count).by(1)

您已经定义了路线,以便来宾嵌套在邀请下-因此,当您发布来宾详细信息以创建来宾时,您还需要提供嵌套在邀请下并与之关联的邀请。见:

POST   /invites/:invite_id/guests(.:format)          guests#create
您的
create
操作还需要
invite\u id
。您也在控制器中使用该
invite\u id
,因此必须提供它

尝试:


您已经定义了路线,以便来宾嵌套在邀请下-因此,当您发布来宾详细信息以创建来宾时,您还需要提供嵌套在邀请下并与之关联的邀请。见:

POST   /invites/:invite_id/guests(.:format)          guests#create
您的
create
操作还需要
invite\u id
。您也在控制器中使用该
invite\u id
,因此必须提供它

尝试:


您已经定义了路线,以便来宾嵌套在邀请下-因此,当您发布来宾详细信息以创建来宾时,您还需要提供嵌套在邀请下并与之关联的邀请。见:

POST   /invites/:invite_id/guests(.:format)          guests#create
您的
create
操作还需要
invite\u id
。您也在控制器中使用该
invite\u id
,因此必须提供它

尝试:


您已经定义了路线,以便来宾嵌套在邀请下-因此,当您发布来宾详细信息以创建来宾时,您还需要提供嵌套在邀请下并与之关联的邀请。见:

POST   /invites/:invite_id/guests(.:format)          guests#create
您的
create
操作还需要
invite\u id
。您也在控制器中使用该
invite\u id
,因此必须提供它

尝试:


您的来宾工厂是否可能不在/spec/factories/guests.rb中?复数?@w1zeman1p不幸的是没有。我希望解决方案能这么简单!您的来宾工厂是否可能不在/spec/factories/guests.rb中?复数?@w1zeman1p不幸的是没有。我希望解决方案能这么简单!您的来宾工厂是否可能不在/spec/factories/guests.rb中?复数?@w1zeman1p不幸的是没有。我希望解决方案能这么简单!您的来宾工厂是否可能不在/spec/factories/guests.rb中?复数?@w1zeman1p不幸的是没有。我希望解决方案能这么简单!我有以下第一个选择:有什么想法吗?我感觉我的路线一团糟,但应用程序可以“创建”很好…我有以下第一个选择:有什么想法吗?我感觉我的路线一团糟,但应用程序可以“创建”很好…我有以下第一个选择:有什么想法吗?我感觉我的路线一团糟,但应用程序可以“创建”很好…我有以下第一个选择:有什么想法吗?我感觉我的路线一团糟,但应用程序可以“创建”好。。。