Mam specyfikację, z obiektem i dwoma kontekstami. W jednym kontekście ustawiłem jeden klucz do zero, a drugi nie:
describe SomeClass::SomeService, type: :model do
describe '#some_method' do
subject { described_class.new(params, current_user).some_method }
mocked_params = {
min_price: 0,
max_price: 100
}
let(:params) { mocked_params }
let(:current_user) { User.create(email: 'name@mail.com') }
context 'with invalid params' do
it 'returns nil if any param is nil' do
params[:min_price] = nil
expect(subject).to eq(nil)
end
end
context 'with valid params' do
it 'returns filtered objects' do
expect(subject).to eq([])
end
end
end
end
Problem polega na tym, że drugi test nie powiedzie się, ponieważ min_price
jest nadal zerowy.
- Czytałem to z szyn 5 na I nie potrzebuję
database_cleaner
. Czy potrzebuję tego, czy nie? - Myślałem, że metoda
let
tworzy nowy obiekt za każdym razem, gdy widzi zmienną. Ponieważ mam dwa konteksty, a metodasubject
jest wywoływana w obu obu, i wewnątrzsubject
Mam zmiennąparams
, dlaczego obiektparams
nie Nowy ze wszystkimi polami w każdym kontekście?
0
AlbertMunichMar
14 marzec 2020, 15:06
1 odpowiedź
Dzieje się tak, ponieważ zainicjujesz mocked_params
tylko raz, gdy plik zostanie załadowany, a następnie zmienisz ten hash w pierwszym teście.
Zamiast tego utwórz params w bloku {X0}}, który doprowadziłby do ponownego utworzenia hasha dla każdego testu.
Zmiana
mocked_params = {
min_price: 0,
max_price: 100
}
let(:params) { mocked_params }
Do
let(:params) do
{
min_price: 0,
max_price: 100
}
end
2
spickermann
14 marzec 2020, 12:14
Podobne pytania
Nowe pytania
ruby-on-rails
Ruby on Rails to framework aplikacji internetowych typu open source z pełnym stosem, napisany w języku Ruby. Opiera się na popularnym modelu frameworkowym MVC i jest znany ze swojego podejścia do tworzenia aplikacji „konwencja zamiast konfiguracji”.