2014-12-02 15 views
7

posso verificare se argomenti vengono passati come:prova se un blocco viene passato con RSpec Mocks

RSpec.describe do 
    it do 
    obj = double 
    expect(obj).to receive(:method).with(1, 2, 3) 
    obj.method(1, 2, 3) 
    end 
end 

Come devo fare circa un parametro di blocco? Il mio codice ideale:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3).with_block(proc) 
    obj.method(1, 2, 3, &proc) 
    end 
end 
+0

richiesto tale funzione su questioni RSpec https://github.com/rspec/rspec-mocks/issues/1182 – hakunin

risposta

0

Non è possibile utilizzare l'aspettativa per verificare che venga passato un blocco specifico. È possibile verificare che il codice viene eseguito con l'aggiunta di codice al suo interno, ad esempio:

RSpec.describe do 
    it do 
    obj = double 
    block_is = double('block') 
    block = -> { 
     block_is.run 
    } 

    expect(obj).to receive(:method).with(1, 2, 3).and_yield 
    expect(block_is).to receive(:run) 

    obj.method(1, 2, 3, &block) 
    end 
end 
+0

Grazie. and_yield è un po 'complicato ma interessante. – sh01ch1

+0

Hmm, ho appena sono stato in grado di utilizzare: 'consentire (obj) .to ricezione (: metodo) .con (1, 2, 3, e a_proc) .and_return (a_value)'. E ha funzionato come previsto .. EDIT: meh, blocco RSpec semplicemente ignorato) – Waterlink

6

Sembra che non posso semplicemente verificare se un blocco viene passato con il metodo concatenamento. E ho trovato una risposta noiosa, bloccano l'attuazione:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3) do |*args, &block| 
     expect(proc).to be(block) 
    end 
    obj.method(1, 2, 3, &proc) 
    end 
end 

Tuttavia, non possiamo usare un'implementazione di blocco e di altri metodi di configurazione di risposta allo stesso tempo come receive(:method).with(1, 2, 3){|*| ...}.and_call_original.

+0

Mi chiedo se si potrebbe essere in grado di simulare '.and_call_original' utilizzando' super (* args, & block) 'nell'attuazione blocco .... – Ajedi32

+0

RSpec dovrebbe restituire l'ultima istruzione nel blocco do: –

Problemi correlati