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

dgm*_*ora 4 ruby rspec ruby-on-rails nested-attributes factory-bot

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

那是工厂:

FactoryGirl.define do
  factory :user do |x|
    name "Homer"
    after(:build) do
      build :address
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是由 返回的散列build(:user).attributes没有address,尽管如果我检查由 创建的对象build(:user)address是正确构建的。

有什么方法可以轻松生成带有嵌套属性的散列?

dgm*_*ora 5

回答自己以展示技术上可行的解决方案:

let(:valid_attributes) {attributes_for(:user, address_attributes: attributes_for(:address))}
Run Code Online (Sandbox Code Playgroud)

这有效,但我觉得它很笨重。在复杂的情况下,代码会变得非常冗长和丑陋。因为我希望有更好的东西,所以我不投票将此作为解决方案。