2014-12-02 14 views
7

mogę sprawdzić, czy argumenty są przekazywane jak:Sprawdza czy blok jest przekazywana z 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 

Jak mam zrobić parametr bloku? Mój idealny kod:

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

Prośba o tę funkcję w przypadku problemów z Rspec https://github.com/rspec/rspec-mocks/issues/1182 – hakunin

Odpowiedz

0

Nie można używać oczekiwań w celu przetestowania, czy określony blok został przekazany. Można sprawdzić, że kod jest uruchamiany poprzez dodanie kodu wewnątrz niego, na przykład:

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

Dziękuję. and_yield jest nieco trudny, ale interesujący. – sh01ch1

+0

Hmm, po prostu mogłem użyć: 'allow (obj) .to receive (: method) .with (1, 2, 3, a aproc) .and_return (a_value)'. I działało zgodnie z oczekiwaniami. EDYCJA: meh, rspec po prostu ignorowane bloku) – Waterlink

6

Wydaje się, że nie mogę po prostu sprawdzić, czy blok jest przekazywana z metodą łańcuchowych. I znalazłem jeden tępy odpowiedź, blok realizacji:

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 

Jednak nie możemy używać implementację bloku i inne metody konfiguracji odpowiedź w tym samym czasie jak receive(:method).with(1, 2, 3){|*| ...}.and_call_original.

+0

Zastanawiam się, czy możesz być w stanie symulować '.and_call_original' przy użyciu' super (* args, & block) 'w realizacji bloku .... – Ajedi32

+0

RSpec powinien zwrócić ostatnią instrukcję w bloku do: –

Powiązane problemy