2016-02-10 11 views
6

Ho bisogno di verificare che ogni istanza della mia classe riceva un determinato metodo, ma non mi interessa se molte istanze lo ricevono (dovrebbero).Rspec - combina expect_any_instance_of e un conteggio di ricezione

ho provato in questo modo:

expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once) 

Ma a quanto pare, si consente solo per una singola istanza per ricevere il metodo più volte, ma non per le diverse istanze.

C'è un modo per farlo?

risposta

4

Questo è un problema noto in rspec-mocks. Dal v3.4 documentation su Any instance:

L'API rspec-mock è progettato per istanze di oggetti singoli, ma questa caratteristica opera su intere classi di oggetti. Di conseguenza ci sono alcuni casi limite semanticamente confusionari. Ad esempio, in expect_any_instance_of(Widget).to receive(:name).twice non è chiaro se ci si aspetta che un'istanza specifica riceva il nome due volte o se ci si aspetta che due ricevano il totale. (E 'la prima.)

Inoltre

Utilizzando questa funzione è spesso un odore di progettazione. Può essere che il test stia cercando di fare troppo o che l'oggetto in prova sia troppo complesso.

Avete qualche modo di refactoring il test o il codice di applicazione per evitare il "caso limite confusione"? Forse costruendo un test double e aspettandosi di ricevere messaggi?

+0

Forse dicendo alla mia classe che ogni nuovo oggetto dovrebbe essere uno specifico che creo nel mio test? È questa pratica comune? – Mat

+0

Sembra plausibile. Non posso parlare della popolarità, ma provaci! – messanjah