首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails: Rspec和FactoryGirl协会

Rails: Rspec和FactoryGirl协会
EN

Stack Overflow用户
提问于 2015-01-12 21:57:55
回答 2查看 1.3K关注 0票数 0

我试图为我的控制器编写测试,直到我尝试为相关模型(has_many、belongs_to等)编写之前,一切都进行得很顺利。我已经试着阅读了FactoryGirl关于关联的入门指南,并且我已经尽我所能地尽可能地遵循它,但是我发现了一些错误,比如:

代码语言:javascript
复制
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和测试非常陌生。到目前为止,我得到的是:

invites_controller:

代码语言:javascript
复制
...
has_many :guests
...

guests_controller:

代码语言:javascript
复制
....
belongs_to :invite
...

邀请工厂:

代码语言:javascript
复制
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

客服工厂:

代码语言:javascript
复制
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

客座控制员:

代码语言:javascript
复制
...
  def create
    @invite = Invite.find(params[:invite_id])
    @guest = @invite.guests.create(guest_params)
    redirect_to edit_invite_path(@invite)
  end
...

客人控制器规范:

代码语言:javascript
复制
...
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
...

所有的帮助都很感激。

编辑:

路线:

代码语言:javascript
复制
           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:

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

代码语言:javascript
复制
...
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-13 10:45:35

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

代码语言:javascript
复制
POST   /invites/:invite_id/guests(.:format)          guests#create

您的create操作也需要invite_id。您也在控制器中使用该invite_id,因此必须提供它。

尝试:

代码语言:javascript
复制
post :create, invite_id: @invite.id, guest: @guest.attributes
票数 1
EN

Stack Overflow用户

发布于 2015-01-12 22:34:51

attributes_for接受一个符号,该符号返回可以用来构建对象的属性。

在你的情况下,你需要

代码语言:javascript
复制
expect {
  post :create, guest: @guest.attributes
}.to change(Guest,:count).by(1)

或者定义guest_attributes

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27911448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档