我正在使用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
已正确构建。
有没有办法轻松生成具有嵌套属性的哈希?
答案 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)) }