Reputation: 5552
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
Reputation: 940
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