Тестирование против массового назначения - PullRequest
5 голосов
/ 05 мая 2011

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

У меня есть несколько тестов, которые все дают ожидаемый результат.результаты за исключением одного.Я нашел способ обойти это, но мне было интересно, какой будет правильный метод.

Когда я тестирую сохранение в консоли rails, оно не сохраняет поле admin из хэша params, чего я и ожидаю.Когда я строю с фабрикой, затем сохраняю ее, проверки проходят / не проходят соответственно.Когда я проверяю защиту от массового назначения, проверка не проходит (потому что она устанавливает поле администратора, когда я этого не ожидаю)

Есть мысли, предложения или проблемы?

Спасибо

Модель:

class User ...
  #id, name, email, admin(int)
  attr_accesible :name, email
  ...
end

user_spec

it "should not have an admin after a mass save" do
  user = Factory.build(:user)
  user.save
  user.admin.should be_nil    #its not nil, its 0     
end

фабрики

Factory.define :user do |f|
  f.name "rec_acro"
  f.email "rec@acro.com"
  f.admin 0
end

Ответы [ 3 ]

13 голосов
/ 05 мая 2011

Вы можете использовать Следует поверх rspec, чтобы получить краткую спецификацию массового назначения:

describe User do
  it { should_not allow_mass_assignment_of(:admin) }
end
3 голосов
/ 05 мая 2011

FactoryGirl примет каждый атрибут в определении Фабрики и установит его индивидуально.Таким образом, ваш тест на самом деле не проверяет массовое задание

Из кода FactoryGirl ( build.rb ):

  def set(attribute, value)
    @instance.send(:"#{attribute}=", value)
  end

(см. this если вы заинтересованы в большем чтении кода для драгоценного камня FactoryGirl.)

В качестве другого предложенного ответа вы можете использовать Ifa для использования средства сопоставления allow_mass_assignment_of.Он в основном делает что-то вроде:

it "allows mass assignment of :title" do
  accessible = Post.accessible_attributes.include?('title') ||
             !Post.protected_attributes.include?('title')
  accessible.should be_true
end

( Вот немного больше о насчет совпадений.)

2 голосов
/ 05 мая 2011

Factory Girl (по праву так) не использует массовые задания для создания объектов. Возьмите сгенерированный пользовательский объект с фабрики, а затем попытайтесь выполнить массовое назначение, хотя только с параметром admin.

...