Rspec + Factory Girl Первый пример работает, второй + нет - PullRequest
2 голосов
/ 20 марта 2011

У меня есть такая спецификация:

require 'spec_helper'

describe IncomingMailsController do

  include Devise::TestHelpers

  before(:each) do
    @user = Factory.create(:user)
    @user1 = Factory.create(:user)
    @group = Factory(:group)
    @perm1 = Factory.create(:permission, :user => @user)
    @perm2 = Factory.create(:permission, :user => @user1)
  end

  it "xxxxx case 1" do
   ....
  end

  it "xxxxx case 2" do
   ....
  end

Первый случай 1, работает нормально, но затем 2-й сбой с:

Failure/Error: @perm1 = Factory.create(:permission, :user => @user)
     RuntimeError:
       Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
     # ./spec/factories.rb:23

Перед каждым запуском выполняется новый для каждогоэто блокировать?

factories.rb выглядит так:

require 'factory_girl'

Factory.define :user do |f|
  f.sequence(:fname) { |n| "fname#{n}" }
  f.sequence(:lname) { |n| "lname#{n}" }
  f.sequence(:email) { |n| "email#{n}@google.com" }
  f.password               "password"
  f.password_confirmation { |u| u.password }
  f.invitation_code        "dmbsrv82811"
end

Factory.define :group do |f|
  f.name "myGroup"
  f.sequence(:private_email) { |n| "myGroup#{n}" }
end

Factory.define :permission do |f|
  f.role_id         1
  f.group_id do
    (Group.find_by_name('myGroup')).id
  end
  f.creator_id do
    (User.find_by_fname('fname1')).id
  end
end

Спасибо

1 Ответ

5 голосов
/ 20 марта 2011

В строке 23 factory.rb у вас есть

(User.find_by_fname('fname1')).id

Это жестко запрограммировано, чтобы найти fname1.Однако ваша фабрика использует последовательность для определения fname:

f.sequence(:fname) { |n| "fname#{n}" }

Это означает, что во второй спецификации значение для fname будет fname2, а не fname1.Это происходит потому, что последовательности не сбрасываются между различными спецификациями.

Все это означает, что когда вы вызываете User.find_by_fname, он не может найти пользователя с fname1 (только fname2), поэтому он возвращает nil, чтоВот почему вы получаете вызываемый идентификатор для ошибки nil.

- Правка -

Делаете ли вы что-нибудь с атрибутом пользователя, который вы передаете фабрике разрешений (например, с Factory.create(:permission, :user => @user))?Если нет, я бы изменил его на что-то вроде

Factory.create(:permission, :creator => @user)

Примечание: если у вас нет настройки Permission # creator в качестве ассоциации с пользователем, вам нужно будет сделать

Factory.create(:permission, :creator_id => @user.id)

В том же духе вы можете определить свою фабрику более точно в соответствии с

Factory.define :permission do |f|
  f.role_id         1
  f.association :group, :factory => :group
  f.association :creator, :factory => :user
end

Если ваши ассоциации настроены правильно, вам не нужно беспокоиться об идентификаторах, ассоциация правильноВещь для тебя.

...