2010-07-15 8 views
5

Ich habe ein Szenario mehr oder weniger ähnlichenMock Methoden, die einen Block als Parameter erhalten

class A 
    def initialize(&block) 
    b = B.new(&block) 
    end 
end 

Ich bin ein Unit-Test-Klasse, und ich möchte wissen, ob neue B # ist A # geleitet, um den Aufnahme-Block Neu. Ich benutze Mocha als Mock-Framework.

Ist es möglich?

Antwort

0

Ich glaube, Sie wollen:

l = lambda {} 
B.expects(:new).with(l) 
A.new(&l) 

Ich weiß, das mit RSpec funktioniert, ich wäre überrascht, wenn Mocha nicht

Griff
+0

Hat nicht funktioniert. Ich fange an zu glauben, dass ich das auf diese Weise nicht tun kann. Ich werde hier einen anderen Ansatz versuchen. Vielen Dank! :) – rafaelss

2

Ich habe versucht, dies sowohl mit Mokka und RSpec und obwohl ich konnte erhalten Sie einen bestandenen Test, das Verhalten war falsch. Aus meinen Experimenten schließe ich, dass es nicht möglich ist zu überprüfen, dass ein Block übergeben wurde.

Frage: Warum möchten Sie einen Block als Parameter übergeben? Welchen Zweck wird der Block erfüllen? Wann sollte es heißen?

Vielleicht ist das wirklich das Verhalten sollte man mit etwas testen wie:

class BlockParamTest < Test::Unit::TestCase 

    def test_block_passed_during_initialization_works_like_a_champ 
    l = lambda {|name| puts "Hello #{name}"} 
    l.expects(:call).with("Bryan") 
    A.new(&l) 
    end 

end 
0

Ist B::new den Block Nachgeben und hat der Block einen param ändern, die yield bietet? Wenn ja, dann können Sie es auf diese Weise testen:

require 'minitest/autorun' 
require 'mocha/setup' 

describe 'A' do 

    describe '::new' do 

    it 'passes the block to B' do 
     params = {} 
     block = lambda {|p| p[:key] = :value } 
     B.expects(:new).yields(params) 

     A.new(&block) 

     params[:key].must_equal :value 
    end 

    end 

end 
Verwandte Themen