Как получить доступ к переменным экземпляра для проверки `receive` в спецификации?

Используйте атрибут dt.days . Предположим, что td - это имя вашей серии timedelta, доступ к этому атрибуту через:

td.dt.days

Вы также можете получить атрибуты seconds и microseconds таким же образом.

0
задан halfer 4 April 2019 в 07:14
поделиться

1 ответ

Похоже, вы пытаетесь объединить несколько различных тестов в одном выражении 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

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

0
ответ дан aridlehoover 4 April 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: