66322


現在railsでRspecテストを作成中です。  
**factory_bot_rails** のGemを使用しています。  
おそらくfactory_bot_railsを使用しての、データの作成方法に間違いがあると思われるんですが、  
今回の場合、どうすれば **postとuser** 、そして **commentとpostとuser** を紐付ける事が出来るのでしょうか？  
ご教授頂ければ幸いです。

[code]

    [factories/posts.rb]
    FactoryBot.define do
      factory :post do
        association :user
        img { Rack::Test::UploadedFile.new(Rails.root.join("spec/img/people.jpg")) }
    
        trait :created_at_5_years_ago do
          created_at { 5.year.ago }
        end
    
        trait :created_at_1_year_ago do
          created_at { 1.year.ago }
        end
    
        trait :created_at_1_week_ago do
          created_at { 1.week.ago }
        end
    
        trait :created_at_1_day_ago do
          created_at { 1.day.ago }
        end
      end
    end
    
    [models/post_spec.rb]
    require 'rails_helper'
    
    RSpec.describe Post, type: :model do
      it "has a valid factory" do
        expect(FactoryBot.build(:post)).to be_valid
      end
    end
    
    下記エラー内容
    expected #<Post id: nil, img: nil, user_id: nil, created_at: nil, updated_at: nil> to be valid, but got errors: Userを入力してください
    
[/code]

[code]

    [factories/comments.rb]
    FactoryBot.define do
      factory :comment do
        association :user
        association :post
        content { "Comment コメント" }
      end
    end
    
    [models/comment_spec.rb]
    require 'rails_helper'
    
    RSpec.describe Comment, type: :model do
      it "has a valid comment" do
        expect(FactoryBot.build(:comment)).to be_valid
      end
    end
    
    下記エラー内容
    expected #<Comment id: nil, content: "Comment コメント", user_id: nil, post_id: nil, created_at: nil, updated_at: nil> to be valid, but got errors: Userを入力してください, Postを入力してください
    
[/code]


CC BY-SA 4.0
2020-05-05T06:16:44.200
66308
2020-05-05T09:52:53.613
39925
question
ruby-on-rails ruby rspec
Rspecのmodelテストで、user_id: nil, post_id: nilになってしまう。


FactoryBotにおいて、associationには`strategy`オプションが渡せます。  
<https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#build-
strategies-1>  
`strategy: :create`を指定すれば`Post`を`build`したタイミングで`user`が作られます。

* * *

余談ながら、`build`したタイミングで`valid`かどうかを判定することはあまり一般的ではありません。  
もしファクトリ自体が有効であるかどうかを検証したいのであれば、`.lint`メソッドが使えます。  
<https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#linting-
factories>


CC BY-SA 4.0
2020-05-05T09:52:53.613
66322
2020-05-05T09:52:53.613
442
66308
answer