使用accepts_nested_attributes_for为FactoryGirl对象生成嵌套属性

时间:2015-09-21 16:10:47

标签: ruby-on-rails ruby rspec factory-bot nested-attributes

我正在使用RSpec和Factory Girl来测试我的应用程序。我要做的是以下内容:我有一个接受嵌套属性的对象,并且嵌套属性无效。我想测试POST的工作原理:

let(:valid_attributes) { build(:user).attributes }
it "creates a new User" do      
  expect {
    post :create, {user: valid_attributes}, valid_session
  }.to change(User, :count).by(1)
end

那是工厂:

FactoryGirl.define do
  factory :user do |x|
    name "Homer"
    after(:build) do
      build :address
    end
  end
end

问题是build(:user).attributes返回的哈希没有address,但如果我检查build(:user)创建的对象,则address已正确构建。

有没有办法轻松生成具有嵌套属性的哈希?

2 个答案:

答案 0 :(得分:3)

回答自己展示技术上有效的解决方案:

let(:valid_attributes) {attributes_for(:user, address_attributes: attributes_for(:address))}

这很有效,但我发现它非常笨重。在复杂的情况下,代码会变得令人难以置信的冗长和丑陋。正如我期望更好的东西,我不会将其作为解决方案投票。

答案 1 :(得分:0)

您可以自定义对象,同时通过参数构建对象,以便我以这种方式解决您的任务:

let(:valid_attributes) { attributes_for(:user, address: attributes_for(:address)) }