也许这不是需要进行测试的东西,但我正在学习,所以我认为测试到最大值是不对的。
我有几个测试都会产生预期的结果,除了一个。我找到了一种解决方法,但我想知道正确的方法是什么。
当我在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
答案 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参数。