16

I have a model as follows:

class Greeting < ActiveRecord::Base

  attr_accessible :headline, :icon, :content

  belongs_to :user


  accepts_nested_attributes_for :user, :reject_if => proc { |a| a[:name].blank? || a[:email].blank? } 

How can I do an Rspec test for this?

chell
  • 7,646
  • 16
  • 74
  • 140

2 Answers2

34

I just found this shoulda macro, seems like it works fine:

https://gist.github.com/1353500/bae9d4514737a5cd7fa7315338fdd9053dbff543

you should use it like this:

it{ should accept_nested_attributes_for :samples }
joselo
  • 681
  • 1
  • 7
  • 9
16

Here you have Shoulda macro for testing accepts_nested_attributes_for: http://mediumexposure.com/testing-acceptsnestedattributesfor-shoulda-macros/. It does not support any options (such as :reject_if), only bare accepts_nested_attributes_for.

But for :reject_if, you can create a valid Greeting model with nested attributes for User but without :name. Then check if user has been saved, and then same with blank :email

So you can do something like this:

describe Greeting
  it { expect { Factory(:greeting, :user_attributes => Factory_attributes_for(:user)) }.to change(User, :count).by(1) }
  it { expect { Factory(:greeting, :user_attributes => Factory_attributes_for(:user, :name => '')) }.to_not change(User, :count) }
  it { expect { Factory(:greeting, :user_attributes => Factory.attributes_for(:user, :email => '')) }.to_not change(User, :count) }
end
Lee Quarella
  • 4,662
  • 5
  • 43
  • 68
Szymon Przybył
  • 660
  • 9
  • 10