rmcsharry
rmcsharry

Reputation: 5552

Rails rspec — test a model method that depends on associations

I have a simple test to check a custom method on a model Beta::Group

class Beta::Group < ApplicationRecord
  has_many :beta_testers, dependent: :destroy, class_name: 'Beta::Tester', foreign_key: 'beta_group_id'
  has_many :users, through: :beta_testers, source: :user, class_name: '::User'

  validates :name, presence: true, uniqueness: true

  def get_beta_tester(user_id)
    beta_testers.find_by({ user_id: user_id })
  end
end


  describe '#get_beta_tester' do
    subject { create(:beta_tester, user: user, beta_group: new_group) }

    let!(:user) { create(:user) }
    let!(:new_group) { create(:beta_group) }

    it 'should return the beta tester when given a user_id' do
      tester = new_group.get_beta_tester(user.id)

      expect(tester).to eq(subject)
    end
  end

But it fails, because tester is nil. Why is it nil?

EDIT - what I have tried

I tried this, which works, but I don't understand why this works and the previous did not. Can someone explain why?

  describe '#get_beta_tester' do
    it 'should return the beta tester when given a user_id' do
      user = create(:user)
      beta_group = create(:beta_group)
      beta_tester = create(:beta_tester, user: user, beta_group: beta_group)

      tester = beta_group.get_beta_tester(user.id)

      expect(tester).to eq(beta_tester)
    end
  end

Upvotes: 0

Views: 559

Answers (1)

You execute the subject after the find_by, try the following

describe '#get_beta_tester' do
    subject { create(:beta_tester, user: user, beta_group: new_group) }

    let!(:user) { create(:user) }
    let!(:new_group) { create(:beta_group) }
    let(:tester) { new_group.get_beta_tester(user.id) }

    it 'should return the beta tester when given a user_id' do
      subject

      expect(tester).to eq(subject)
    end
  end 

Upvotes: 1

Related Questions