2013-07-10 15 views
67

Poniższy fragment kodu działa zgodnie z oczekiwaniami:Object.any_instance should_receive vs spodziewać(), aby otrzymać

Object.any_instance.should_receive(:subscribe) 

Ale kiedy przy użyciu nowego rspec oczekiwanie to nie działa:

expect(Object.any_instance).to receive(:subscribe) 

Błąd to:

expected: 1 time with any arguments 
received: 0 times with any arguments 

Jak mogę to wykonać, oczekując() na odbiór?

Odpowiedz

141

Istnieje teraz niezbyt dobrze udokumentowana metoda o nazwie expect_any_instance_of, która obsługuje specjalny przypadek any_instance. Powinieneś użyć:

expect_any_instance_of(Object).to receive(:subscribe) 

Google expect_any_instance_of, aby uzyskać więcej informacji.

+0

+1 dla "niezbyt dobrze udokumentowane". Wciąż tak jest. http://www.rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ExampleMethods:expect_any_instance_of – johngraham

+0

Używam 'allow_any_instance_of'. Czy jest to pseudonim tej metody? – rubyprince

+0

@rubyprince Są różne, dzięki metodom pozwalającym na niedokładne zachowanie i oczekują metod testowania zachowania. Na przykład, 'pozwalają (my_obj) .Aby otrzymać (: method_name) .and_return (true)' 'my_obj.method_name odcinki()', więc jeśli to się nazywa w teście po prostu zwraca 'TRUE. 'spodziewać (my_obj) .Aby otrzymać (: method_name) .and_return (true)' nie zmienia żadnych zachowań, lecz ustanawia oczekiwanie niepowodzenia testu jeśli 'my_obj.method_name()' nie jest nazywany w dalszej części test lub nie zwraca prawdy. – Saigo