2013-05-15 15 views
5

Ho un modulo:Come testare un metodo di classe mixed-in viene chiamato con RSpec e Mocha?

module MyModule 
    def do_something 
    # ... 
    end 
end 

utilizzato da una classe come segue:

class MyCommand 
    extend MyModule 

    def self.execute 
    # ... 
    do_something 
    end 
end 

Come faccio a verificare che MyCommand.execute chiamate do_something? Ho provato beffardo parziale con la moka, ma non fallire quando do_something non si chiama:

it "calls do_something" do 
    MyCommand.stubs(:do_something) 
    MyCommand.execute 
end 

risposta

5

bene, è uno soluzione.

Come ho detto nel this SO post, ci sono due strategie per beffardo/stubbing:

1) Utilizzando expects si auto-affermare di moka al termine del test. Nel tuo caso, significa che se MyCommand.execute non viene chiamato dopo lo expects, il test fallirà.

2) Il modo più specifico/assertivo per fare ciò è utilizzare una combinazione di matrici e spie. Lo stub crea l'oggetto falso con il comportamento specificato, quindi il controllo spia per vedere se qualcuno ha chiamato il metodo. Per utilizzare il vostro esempio (notare che questo è RSpec):

require 'mocha' 
require 'bourne' 

it 'calls :do_something when .execute is run' do 
    AnotherClass.stubs(:do_something) 

    MyCommand.execute 

    expect(AnotherClass).to have_received(:do_something) 
end 

# my_command.rb 
class MyCommand 
    def self.execute 
    AnotherClass.do_something 
    end 
end 

Così la linea expect utilizza matcher bourne s' per controllare e vedere se :do_something è stato chiamato il `MyCommand.

4

Ok, sembra che expects è la soluzione:

it "calls do_something" do 
    MyCommand.expects(:do_something) 
    MyCommand.execute 
end 
+0

ha appena avuto questa stessa domanda, può confermare che questa risposta mi consente di posizionare con precisione un'aspettativa per un metodo di classe da chiamare – haiqus

Problemi correlati