FactoryGirl:attributes_for 没有给我关联的属性
我有一个像这样的代码模型工厂:
Factory.define :code do |f|
f.value "code"
f.association :code_type
f.association(:codeable, :factory => :portfolio)
end
但是当我使用像这样的简单 test_should_create_code 测试我的控制器时:
test "should create code" do
assert_difference('Code.count') do
post :create, :code => Factory.attributes_for(:code)
end
assert_redirected_to code_path(assigns(:code))
end
...测试失败。未创建新记录。
在控制台中,attributes_for 似乎没有像 create 那样返回所有必需的属性。
rob@compy:~/dev/my_rails_app$ rails console test
Loading test environment (Rails 3.0.3)
irb(main):001:0> Factory.create(:code)
=> #<Code id: 1, code_type_id: 1, value: "code", codeable_id: 1, codeable_type: "Portfolio", created_at: "2011-02-24 10:42:20", updated_at: "2011-02-24 10:42:20">
irb(main):002:0> Factory.attributes_for(:code)
=> {:value=>"code"}
有什么想法吗?
谢谢,
I have a Code model factory like this:
Factory.define :code do |f|
f.value "code"
f.association :code_type
f.association(:codeable, :factory => :portfolio)
end
But when I test my controller with a simple test_should_create_code like this:
test "should create code" do
assert_difference('Code.count') do
post :create, :code => Factory.attributes_for(:code)
end
assert_redirected_to code_path(assigns(:code))
end
... the test fails. The new record is not created.
In the console, it seems that attributes_for
does not return all required attributes like the create does.
rob@compy:~/dev/my_rails_app$ rails console test
Loading test environment (Rails 3.0.3)
irb(main):001:0> Factory.create(:code)
=> #<Code id: 1, code_type_id: 1, value: "code", codeable_id: 1, codeable_type: "Portfolio", created_at: "2011-02-24 10:42:20", updated_at: "2011-02-24 10:42:20">
irb(main):002:0> Factory.attributes_for(:code)
=> {:value=>"code"}
Any ideas?
Thanks,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以尝试这样的操作:
检查以下内容:http://groups.google.com/group/factory_girl/ browser_thread/thread/a95071d66d97987e)
You can try something like this:
Check this: http://groups.google.com/group/factory_girl/browse_thread/thread/a95071d66d97987e)
这个不返回时间戳等,只返回可进行批量分配的属性:
尽管如此,它还是很丑陋。我认为 FactoryGirl 应该提供类似这样的开箱即用的东西。
我在此处提出了对此的请求。
This one doesn't return timestamps etc., only attributes that are accessible for mass assignment:
Still, it's quite ugly. I think FactoryGirl should provide something like this out of the box.
I opened a request for this here.
我建议另一种方法,我认为它更清晰:
I'd suggest yet an other approach, which I think is clearer:
这就是我最终要做的......
heres what I end up doing...
我综合了一下其他人的说法,希望对其他人有帮助。为了与所讨论的 FactoryGirl 版本保持一致,我使用了 Factory.build() 而不是 FactoryGirl.build()。根据需要进行更新。
只需调用此方法来代替 Factory.attributes_for:
完整要点(在辅助模块内)位于:https: //gist.github.com/jlberglund/5207078
I've synthesized what others have said, in case it helps anyone else. To be consistent with the version of FactoryGirl in question, I've used Factory.build() instead of FactoryGirl.build(). Update as necessary.
Simply call this method in place of Factory.attributes_for:
The full gist (within a helper module) is here: https://gist.github.com/jlberglund/5207078
在我的 APP/spec/controllers/pages_controllers_spec.rb 中,我设置:
因为我有两个关联的模型。这也有效:
In my APP/spec/controllers/pages_controllers_spec.rb I set:
Because I have two models associated. This works too:
这是另一种方法。您可能想省略
id
、created_at
和updated_at
属性。FactoryGirl.build(:car).attributes. except('id', 'created_at', 'updated_at').symbolize_keys
限制:
create
,如association :user,strategy: :create
。如果你不明智地使用这个策略,它会让你的工厂变得非常缓慢。Here's another way. You probably want to omit the
id
,created_at
andupdated_at
attributes.FactoryGirl.build(:car).attributes.except('id', 'created_at', 'updated_at').symbolize_keys
Limitations:
create
, as inassociation :user, strategy: :create
. This strategy can make your factory very slow if you don't use it wisely.