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.

  1. Czytałem to z szyn 5 na I nie potrzebuję database_cleaner. Czy potrzebuję tego, czy nie?
  2. Myślałem, że metoda let tworzy nowy obiekt za każdym razem, gdy widzi zmienną. Ponieważ mam dwa konteksty, a metoda subject jest wywoływana w obu obu, i wewnątrz subject Mam zmienną params, dlaczego obiekt params 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