2011-07-01 74 views
12

我有一個模型,如下所示:如何測試accepts_nested_attributes_for使用RSpec Rails3中

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? } 

我怎樣才能做一個Rspec的測試呢?

回答

12

這裏您有Shoulda用於測試的宏accepts_nested_attributes_forhttp://mediumexposure.com/testing-acceptsnestedattributesfor-shoulda-macros/。它不支持任何選項(如:reject_if),僅支持accepts_nested_attributes_for

但是對於:reject_if,您可以創建一個有效的Greeting模型,其嵌套屬性爲User,但不包含:name。然後檢查用戶是否已被保存,然後用空白:email

一樣的,所以你可以做這樣的事情:

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