簡體   English   中英

Rails:Rspec和FactoryGirl協會

[英]Rails: Rspec and FactoryGirl Associations

我正在嘗試為我的控制器編寫測試,直到我嘗試編寫關聯模型(has_many,belongs_to等)為止,一切都進行得很順利。我嘗試閱讀有關關聯的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>

我對Rails和測試非常陌生。 到目前為止,這是我得到的:

邀請函:

...
has_many :guests
...

guest_controller:

....
belongs_to :invite
...

邀請工廠:

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

來賓控制器:

...
  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:

我已經按照以下可能的答案更新了guests controller規范,但仍然失敗

...
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
...

我收到以下錯誤:

http://pastebin.com/WdyT6xtK

attributes_for接受一個符號,該符號返回可以用來構建對象的屬性。

在您的情況下,您將需要

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

或定義guest_attributes

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_id 您也在控制器中使用了那個invite_id ,因此必須提供它。

嘗試:

post :create, invite_id: @invite.id, guest: @guest.attributes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM