Как получить доступ к переменным экземпляра для проверки `receive` в спецификации? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть следующий фрагмент спецификации:

  it 'should create company and user' do
    company_iv = assigns(:company)
    user_iv = assigns(:user)
    expect(subject).to receive(:create_timeline_event).with(company_iv, user_iv)
    expect { post :create, params }.to change { User.count }.by(1).and change { Company.count }.by(1)

и я традиционно использую синтаксис получения для проверки вызова метода.Я обычно называю это перед вызовом, чтобы отправить в вышеупомянутом фрагменте.Как мне получить доступ к переменной экземпляра пользователя и компании для этой спецификации?

1 Ответ

0 голосов
/ 05 марта 2019

Похоже, вы пытаетесь объединить несколько разных тестов в один оператор it.Вот как я мог бы подойти к этому:

it 'creates company and user' do
  expect { post :create, params }
    .to change { User.count }.by(1)
    .and change { Company.count }.by(1)
end

it 'assigns instance variables' do
  post :create, params

  expect(assigns(:company)).to eq(Company.last)
  expect(assigns(:user)).to eq(User.last)
end

it 'calls create_timeline_event with newly created company and user' do
  allow(some_object).to receive(:create_timeline_event)

  post :create, params

  expect(some_object)
    .to have_received(:create_timeline_event)
    .with(Company.last, User.last)
end

Обратите внимание, что эти тесты будут медленными, потому что они попали в базу данных.Другой подход к этому заключается в использовании макетов.Это выглядело бы примерно так:

let(:params) { ... }
let(:company) { instance_double(Company) }
let(:user) { instance_double(User) }

before do 
  allow(Company).to receive(:create).and_return(company)
  allow(User).to receive(:create).and_return(user)
  allow(some_object).to receive(:create_timeline_event)

  post :create, params
end

it 'creates company and user' do
  expect(Company).to have_received(:create).with(company_params)
  expect(User).to have_received(:create).with(user_params)
end

it 'assigns instance variables' do 
  expect(assigns(:company)).to eq(company)
  expect(assigns(:user)).to eq(user)
end

it 'calls create_timeline_event with newly created company and user' do
  expect(some_object)
    .to have_received(:create_timeline_event)
    .with(company, user)
end

Эти тесты вообще не затрагивают базу данных, что означает, что они будут выполняться намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...