【问题标题】:How to create a factory where two objects belong to the same parent?如何创建两个对象属于同一个父对象的工厂?
【发布时间】:2012-09-26 14:52:19
【问题描述】:

我有以下工厂:

factory :user do
    name 'Henk'
    email 'foo@bar.co'
    password 'foobar'
    password_confirmation { |u| u.password }
end

factory :photo do |ph|
    user
    ph.subtitle 'abc'
    ph.photo { fixture_file_upload( Rails.root.join( 'spec', 'fixtures', 'files', 'test-file-one.png' ), 'image/png') }
end

factory :ad do |ad|
    user
    name 'Kip'
    reason 'Ik wil gewoon hele mooie nieuwe, om een beetje van te eten.'
    price 69.15
end

照片和广告都属于用户,但照片也属于广告。这是一个问题,因为每当我测试 Photo 和 Add 之间的关系时,用户验证都会正确地抱怨该电子邮件的用户已经在使用中。如何告诉 rspec 再次使用同一个用户,而不是尝试使用同一个工厂创建另一个用户?

【问题讨论】:

    标签: ruby-on-rails testing rspec factory-bot


    【解决方案1】:

    确保使用相同父级的最简单方法是在测试期间将父级传递到工厂创建中。例如:

    @user = FactoryGirl.create(:user)
    @photo = FactoryGirl.create(:photo, user: @user)
    @ad = FactoryGirl.create(:ad, user: @user)
    

    这将确保photoad 使用相同的user 父对象,这样您就可以避免遇到的验证问题。

    【讨论】:

    • 我花了一段时间来测试这个,但你的解决方案有效,谢谢。在您看来,这是一个好的数据库结构吗?我的同事建议照片应该属于应该属于用户的广告,并且照片和用户之间不应该存在直接关系,您怎么看?谢谢你的回复^^
    • 我通常会尝试思考对象在特定解决方案方面的关系。在这种情况下,用户是否拍摄或上传照片,那么它可能应该属于用户。没有广告的照片是否可以存在,它应该属于用户或独立。通常最好考虑一下 API 或网页本身可能如何工作,以及用户将如何与它们交互,这通常会使关系更加清晰。
    • 哈,我一开始就是这么说的!现在完全要烧死我的同事了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多