Witam!
Mam kolosalny problem z testami napisanymi przy użyciu Rspec oraz z wykorzystaniem database_cleanera. Ciężko opisać ten problem bo to co się dzieje z moimi testami zdaje się być totalnie losowe i nieprzewidywalne i praktycznie za każdym odpaleniem polecenia rspec
dostaje inne wyniki. Raz nie przechodzi jeden test, innym razem nie przechodzą trzy a jeszcze innym wszystko jest okej. Problemy te dotyczą głównie controller oraz feature spec-ów dlatego użyje jednego z nich jako przykładu (obydwa testy w tym pliku albo przechodzą na zielono, albo jeden z nich się wysypuje [tylko jeden!]):
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
Na ten przykład - podczas uruchamiania pierwszego testu, company
utworzone w let
istnieje w bazie więc wszystko działa okej. Kiedy jednak uruchamia się test nr. 2, rspec tworzy mi w bazie nowy rekord typu Company
a tamten poprzedni kasuje. Kod testu nie bierze tego jednak pod uwagę i uruchamia kontroler “z myślą” o tym company
, które zostało skasowane [pewnie przez database_cleanera] dlatego wszystko się wysypuje.
Najczęstszy scenariusz jest taki, że jeden plik z testami odpalony pojedynczo działa okej; odpalenie natomiast całego folderu specs
skutkuje wysypaniem tego konkretnego pliku, który indywidualnie przeszedł na zielono.
Moja konfiguracja database_cleaner:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before type: :controller do
DatabaseCleaner.strategy = :truncation
end
config.before type: :feature do
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Zaznaczam, że praktycznie bez względu na to jak ustawie sobie strategię dla controller
i feature
, to i tak dostaje losowe wyniki.
Sytuacja ta wyklucza możliwość napisania testów dla kontrolerów mojej, dosyć sporej, aplikacji co trochę spędza mi sen z powiek. Mam nadzieje, że ktoś będzie w stanie mi pomóc. Dzięki!