Pisząc testy RSpec, piszę dużo kodu, który wygląda tak, aby upewnić się, że metoda została wywołana podczas wykonywania testu (ze względu na argument, powiedzmy, że tak naprawdę nie mogę przesłuchać stanu obiektu po wywołaniu, ponieważ operacja, którą wykonuje metoda, nie jest łatwa do zobaczenia).
describe "#foo"
it "should call 'bar' with appropriate arguments" do
called_bar = false
subject.stub(:bar).with("an argument I want") { called_bar = true }
subject.foo
expect(called_bar).to be_true
end
end
Chcę wiedzieć: czy jest dostępna ładniejsza składnia niż ta? Czy brakuje mi jakiejś fajnej niesamowitości RSpec, która zredukowałaby powyższy kod do kilku wierszy? should_receive
wydaje się, że powinien to zrobić, ale czytając dalej, wydaje się, że to nie jest dokładnie to, co robi.
ruby-on-rails
ruby
rspec
Mikey Hogarth
źródło
źródło
should_receive
, więc pomyślałem, że to pytanie pomoże.Odpowiedzi:
źródło
called_bar
. To była tylko flaga zapewniająca, że metoda została wywołana, ale zexpect(...).to receive(...)
tobą już to obejmuje. To jest bardziej przejrzyste i semantyczneW nowej
rspec
expect
składni wyglądałoby to tak:źródło
Poniższe powinno działać
Dokumentacja: https://github.com/rspec/rspec-mocks#expecting-arguments
źródło
have_received
(po fakcie podejście „szpiegów”), a niehas_received
, co nie jest częścią żadnej znanej mi wersji RSpec.Aby w pełni zachować zgodność ze składnią RSpec ~> 3.1 i
rubocop-rspec
domyślną opcją regułyRSpec/MessageSpies
, oto co możesz zrobić zspy
:Jeśli nie używasz rubocop-rspec lub nie używasz opcji domyślnej. Możesz oczywiście użyć standardu RSpec 3 z oczekiwaniem.
źródło