针对质量分配的测试

时间:2011-05-05 03:01:19

标签: ruby-on-rails unit-testing rspec factory-bot

也许这不是需要进行测试的东西,但我正在学习,所以我认为测试到最大值是不对的。

我有几个测试都会产生预期的结果,除了一个。我找到了一种解决方法,但我想知道正确的方法是什么。

当我在rails控制台中测试保存时,它不会保留params散列中的admin字段,这正是我所期望的。当我使用工厂构建然后保存它时,验证通过/失败。当我测试针对质量分配的保护时,测试失败(因为它设置了我希望不会的管理字段)

有任何想法,建议或疑虑吗?

谢谢

型号:

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 个答案:

答案 0 :(得分:13)

您可以在rspec之上使用Shoulda来获得简洁的质量分配规范:

describe User do
  it { should_not allow_mass_assignment_of(:admin) }
end

答案 1 :(得分:3)

FactoryGirl将获取Factory定义中的每个属性并单独设置它。所以你的测试实际上不测试质量分配

来自FactoryGirl代码(build.rb):

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

(如果您对更多代码读取FactoryGirl gem感兴趣,请参阅this。)

如另一个答案所示,您可以使用Shoulda来使用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

Here's a little更多关于应该匹配的事情。)

答案 2 :(得分:2)

Factory Girl(理所当然地)不使用质量分配来生成对象。从工厂获取生成的用户对象,然后尝试对其进行批量分配,尽管只使用admin参数。