2015-01-12 3 views
0

컨트롤러에 대한 테스트를 작성하려고하는데 관련 모델 (has_many, belongs_to 등 ...)에 대한 글쓰기를 시도 할 때까지 모든 것이 잘 진행되고있었습니다. 시작 안내서를 읽으려고했습니다. FactoryGirl 협회에 관한 나는 최선 내가 할 수있는 수행하려고했습니다,하지만 난 같은 오류를 얻을 :레일즈 : Rspec 및 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> 

나는 매우 새로운 레일 및 테스트를 위해입니다. 여기에 지금까지있어 무엇 :

invites_controller :

... 
has_many :guests 
... 

guests_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 : 나는 가능한 답변을 아래에 따라 손님 컨트롤러 사양 업데이트되었습니다

, 그것은 여전히 ​​실패하는 것

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

+0

그것은 게스트 공장 /spec/factories/guests.rb하지 않을 가능성이있다? 복수형? – w1zeman1p

+0

@ w1zeman1p 불행히도 없습니다. 나는 그 간단한 해결책을 원합니다! – lkemitchll

답변

1

정의하는 것입니다 - 당신이 게스트 세부 사항을 게시 때문에 때 게스트를 만들려면 중첩 된 초대를 제공해야하며이 초대와 연결됩니다. 참조 :

POST /invites/:invite_id/guests(.:format)   guests#create 

귀하의 create 행동뿐만 아니라 invite_id이 필요합니다. 컨트롤러에 invite_id도 사용하고 있으므로 반드시 제공해야합니다.

시도 :

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

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) 
+0

첫 번째 옵션은 다음과 같습니다. http://pastebin.com/WdyT6xtK 아이디어가 있습니까? 내 경로가 엉망이되었다는 느낌을 받지만 앱이 '잘 만들 수 있습니다 ...' – lkemitchll

관련 문제