2013-05-15 9 views
8

Desidero eseguire lo stub di un metodo con Mocha solo quando viene fornito un valore di parametro specifico e chiamare il metodo originale quando viene fornito un altro valore.Mocha: metodo di stub con parametro specifico ma non per altri parametri

Quando faccio così:

MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true) 

ottengo una

unexpected invocation for MyClass.show?(:other_value) 

so anche che posso stub tutti i parametri quando si scrive il mock senza il'with'-chiamata e quindi dai la mia specifica finta. Ma poi devo sapere il valore restituito per ogni chiamata, che non è il caso:/

tldr; C'è un modo per chiamare il metodo originale in uno stub o per stub solo parametri specifici e lasciare gli altri?

risposta

1

La risposta dipende da cosa esattamente stai testando.

Alcune note:

1) Ho sempre evitare di utilizzare stubs.any_instance. Puoi essere specifico nei tuoi stub/mock, che impedisce falsi positivi ai test.

2) Preferisco utilizzare spie con stub per affermare attivamente che qualcosa è stato chiamato. Per questo scopo usiamo la gemma bourne. L'alternativa è quella di utilizzare un mock, che verifica implicitamente se qualcosa viene chiamato (ad esempio fallirà se non ottenere chiamato.

Quindi la classe-metodo potrebbe sembra qualcosa di simile (nota, questo è RSpec sintassi):.

require 'bourne' 
require 'mocha' 

it 'calls MyClass.show?(method_params)' do 
    MyClass.stubs(:show?) 

    AnotherClass.method_which_calls_my_class 

    expect(MyClass).to have_received(:show?).with('parameter!') 
end 

class AnotherClass 
    def self.method_which_calls_my_class 
    MyClass.show?('parameter!') 
    end 
end 

ci sono un sacco di esempi stub/spia here

Spero che questo aiuti

+0

non hai mostrare come evitare usando 'any_instance' però Nella mia esperienza questo.. richiede additi derisione formale del codice di istanziazione che può essere o meno ugualmente o addirittura più soggetto a errore e fragile. – gtd