Сбой валидации RSpec для ассоциаций, выполненных через Factory_girl - PullRequest
0 голосов
/ 11 августа 2011

Я пробую что-то простое и пропускаю очевидное.Разве Factory_Girl не должен автоматически создавать ассоциацию?Если это так, почему приведенная ниже спецификация «GET index» не работает, потому что event_id равен nil ?

Событие has_many: posts

#post.rb
  ...
  belongs_to :event
  validates :event_id, :presence => true
  ...

#factories.rb
Factory.define :event do |event|
  event.name "The Long Event Title"
end

Factory.define :post do |post|
  post.title "This is a post"
  post.association :event
end


#posts_controller_spec.rb
before(:each) do
  @attr = Factory.attributes_for(:post)
end

describe "GET index" do
  it "assigns all posts as @posts" do
    post = @user.posts.create(@attr)    ### <-- event_id not assigned?
    # post = FactoryGirl.create(:post)  ### <-- this doesn't work either
    get :index
    assigns(:posts).should eq([post])
  end
end

Edit: Пример дополнительной спецификации:

describe "POST create" do
    describe "with valid params" do
      it "creates a new Post" do
        expect {
          post :create, :post => @attr, :event => Factory.create(:event)  <- fail
        }.to change(Post, :count).by(1)
      end

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Из вики FactoryGirl: https://github.com/thoughtbot/factory_girl/wiki/Usage

# Attribute hash (ignores associations)
user_attributes = Factory.attributes_for(:user)

То есть вы не получаете event_id, и именно поэтому он не работает.

Кроме того, вы сказали, что пытались post = FactoryGirl.create(:post), но вы должны сделать post = Factory.create(:post), и это заставит его работать.

Возможно, в вашем блоке before () вы должны просто создать и сохранить сообщение, если только у вас нет теста, который требует, чтобы он еще не был сохранен.

0 голосов
/ 11 августа 2011

Попробуйте изменить

validates_presence_of :event_id

до

validates_presence_of :event
...