Исчезающие данные в спецификации контроллера
У меня действительно раздражающая проблема с созданием простой спецификации контроллера с Rspec. Метод вызывающий проблемы называется #set_company
и устанавливает родительскую "учетную запись" для текущего вошедшего в систему пользователя.
def set_company
return false if !user_signed_in?
current_company = Company.find(current_user.company_id)
set_current_tenant(current_company)
end
Мои спецификации выглядят так:
require 'spec_helper'
describe Api::V3::UsersController, :type => :controller do
describe 'GET #index' do
let(:user) { FactoryGirl.create(:user) }
let(:company) { user.company }
before {
allow(controller).to receive(:current_user) {user}
allow(controller).to receive(:current_tenant) {company}
}
it 'returns 200' do
get :index
expect(response.code.to_i).to eq 200
end
it 'assigns @users' do
get :index
expect(assigns(:users)).to eq [user]
end
end
end
Дело в том, что второй тест - зеленый, а первый - нет (этот порядок правильный!). Он красный, и потому, что когда он срабатывает, нет такой вещи, как company
, Вот как это происходит:
user
создается (сcompany
это зависимость), идентификаторы этого пользователя равны 1, а идентификатор компании, созданной этим пользователем, также равен 1- второй тест запускается и все отлично
- первый тест запускается, но нет
Company
с ID=1 в базе данных, есть новый с ID=2, который, очевидно, неправильно и вызывает мойset_company
метод падать.
Я думаю, что это может быть связано с тем, что я использую database_cleaner, но я совершенно не знаю, как с этим справиться и что я могу с этим поделать. Спасибо всем за любые подсказки.
1 ответ
Если у вас еще нет тестов на основе JavaScript, тогда не нужно использовать database_cleaner. Пока транзакционные фиксации включены, данные будут автоматически очищаться между каждым тестом.