Как я могу проверить Accepts_nested_attributes_for с Rspec Rails3 - PullRequest
13 голосов
/ 01 июля 2011

У меня модель выглядит следующим образом:

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?

Ответы [ 2 ]

26 голосов
/ 27 февраля 2012

Я только что нашел этот макрос musta, похоже, он работает нормально:

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

Вы должны использовать его следующим образом:

it{ should accept_nested_attributes_for :samples }
14 голосов
/ 19 июля 2011

Здесь у вас есть Shoulda макрос для тестирования accepts_nested_attributes_for: http://mediumexposure.com/testing-acceptsnestedattributesfor-shoulda-macros/. Он не поддерживает какие-либо параметры (например, :reject_if), только голый accepts_nested_attributes_for.

Но для :reject_if вы можете создать действительную модель приветствия с вложенными атрибутами для 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
...