Исчезающие данные в спецификации контроллера

У меня действительно раздражающая проблема с созданием простой спецификации контроллера с 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, Вот как это происходит:

  1. user создается (с companyэто зависимость), идентификаторы этого пользователя равны 1, а идентификатор компании, созданной этим пользователем, также равен 1
  2. второй тест запускается и все отлично
  3. первый тест запускается, но нет Company с ID=1 в базе данных, есть новый с ID=2, который, очевидно, неправильно и вызывает мой set_company метод падать.

Я думаю, что это может быть связано с тем, что я использую database_cleaner, но я совершенно не знаю, как с этим справиться и что я могу с этим поделать. Спасибо всем за любые подсказки.

1 ответ

Если у вас еще нет тестов на основе JavaScript, тогда не нужно использовать database_cleaner. Пока транзакционные фиксации включены, данные будут автоматически очищаться между каждым тестом.

Другие вопросы по тегам