2013-03-30 6 views
4

У меня есть следующие модели:FactoryGirl и belongs_to ассоциации при тестировании Rspec

class Team < ActiveRecord::Base 
    # Setup accessible (or protected) attributes for your model 
    attr_accessible :name 
    validates_presence_of :name 

    belongs_to :user 

end 

Что тестируется:

describe Team do 

    before(:each) do 
    @attr = FactoryGirl.attributes_for(:team) 
    end 

    it "should belong to a user" do 
    @team = Team.create!(@attr) 
    @team.should belong_to(:user) 
    end 
end 

И у меня есть следующие заводы:

FactoryGirl.define do 
    factory :team do 
    name 'Dream Team' 
    sport 
    user 
    end 
end 

FactoryGirl.define do 
    factory :user do 
    name 'Test User' 
    last_name 'Last Name' 
    email '[email protected]' 
    password 'changeme' 
    password_confirmation 'changeme' 
    end 
end 

Когда Я тестирую спецификацию, я получаю следующий сбой:

1) Team should belong to a user Failure/Error: @team = Team.create!(@attr) ActiveRecord::StatementInvalid: SQLite3::ConstraintException: teams.user_id may not be NULL: INSERT INTO "teams" ("created_at", "name", "sport_id", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?)

Почему? В документах говорится, что для установки ассоциации вы можете просто написать имя фабрики, в моем случае это пользователь.

Благодаря

+0

Полагаю, вы используете либо 'musta-matchers', либо' замечательный'? – depa

+0

Straight rspec-rails 2.13.0 –

+0

Если я не ошибаюсь, я не думаю, что 'owned_to' является одним из стандартных сокетов в RSpec 2. Вам нужно что-то другое, чтобы иметь возможность написать это. https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers – depa

ответ

4

FactoryGirl.attributes_for даст вам хэш, содержащий атрибуты для указанной модели только, не включая ассоциации атрибутов - в вашем случае, user_id.

Это вызовет ошибки в случае, если user_id является обязательным полем, и вы пытаетесь создать экземпляр Team с помощью FactoryGirl.create(attributes_for(:team)).

Однако, если вы используете FactoryGirl.create(:team), он должен предоставить вам действительный экземпляр Team.

0

Вы не должны использовать before(:each) с FactoryGirl и Rspec, на самом деле более изящным способом создания этого теста, в соответствии с рельсами 4 Way Глава 21, является использованием let(:team) { FactoryGirl.create(:team } до вашего него заявления

это позволяет вы не должны использовать так много переменных экземпляра, при желании я могу привести пример, если этого объяснения недостаточно.

Смежные вопросы