我是RSpec的新手,并尝试使用Factory Girl与控制器规格中的关联来解决问题。困难是:
所以如果我有这样的模型:
class Brand < ActiveRecord::Base
belongs_to :org
validates :org, :presence => true
end
class Org < ActiveRecord::Base
has_many :brands
end
这样的工厂:
FactoryGirl.define do
factory :brand do
association :org
end
end
此控制器规范失败:
describe BrandsController do
describe "POST create with valid params" do
it "creates a new brand" do
expect {
post :create, brand: attributes_for(:brand)
}.to change(Brand, :count).by(1)
end
end
end
(如果我注释掉“验证:org,:presence =&gt; true”它会通过)
建议了一些解决方案,我认为我一直在制作简单的错误,这意味着我无法使其中的任何一个工作。
1)将工厂更改为每a suggestion on this page的org_id失败了许多测试失败了“验证失败:组织不能为空”
FactoryGirl.define do
factory :brand do
org_id 1002
end
end
2)使用“symbolize_keys”看起来很有希望。 Here和here建议使用以下代码:
(FactoryGirl.build :position).attributes.symbolize_keys
我不确定如何在我的情况下应用这个。以下是猜测不起作用(给出错误No route matches {:controller =&gt;“brands”,:action =&gt;“{:id =&gt; nil,:name =&gt; \”MyString \“ ,:org_id =&gt; 1052,:include_in_menu =&gt; false,:created_at =&gt; nil,:updated_at =&gt; nil}“}):
describe BrandsController do
describe "POST create with valid params" do
it "creates a new brand" do
expect {
post build(:brand).attributes.symbolize_keys
}.to change(Brand, :count).by(1)
end
end
end
更新
我几乎得到了这个与Shioyama的答案,但得到了错误信息:
Failure/Error: post :create, brand: build(:brand).attributes.symbolize_keys
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: id, created_at, updated_at
所以关注this question我将其更改为:
post :create, brand: build(:brand).attributes.symbolize_keys.reject { |key, value| !Brand.attr_accessible[:default].collect { |attribute| attribute.to_sym }.include?(key) }
哪个有效!
答案 0 :(得分:2)
在您的解决方案2)中,您尚未将操作传递给post
,这就是它抛出错误的原因。
尝试将expect
块中的代码替换为:
post :create, brand: build(:brand).attributes.symbolize_keys