test rails para mock mini mental juego ruby unit-testing testing minitest

rails - ¿Cómo afirmar que cierto método se llama con Ruby Minitest framework?



mock minitest (3)

Quiero probar si una función invoca otras funciones correctamente con el minitest Ruby, pero no puedo encontrar una aserción adecuada para probar desde el doc .

El código fuente

class SomeClass def invoke_function(name) name == "right" ? right () : wrong () end def right #... end def wrong #... end end El código de prueba:

describe SomeClass do it "should invoke right function" do # assert right() is called end it "should invoke other function" do # assert wrong() is called end end


Con minitest, utiliza el método expect para establecer la expectativa de que se llame a un método en un objeto simulado como tal.

obj = MiniTest::Mock.new obj.expect :right

Si desea establecer la expectativa con parámetros y valores de retorno, entonces:

obj.expect :right, return_value, parameters

Y para el objeto concreto como tal:

obj = SomeClass.new assert_send([obj, :right, *parameters])


De acuerdo con el ejemplo dado, no hay otra clase delegada, y quiere asegurarse de que el método se llame correctamente desde la misma clase. Entonces el siguiente fragmento de código debería funcionar:

class SomeTest < Minitest::Test def setup @obj = SomeClass.new end def test_right_method_is_called @obj.stub :right, true do @obj.stub :wrong, false do assert(@obj.invoke_function(''right'')) end end end def test_wrong_method_is_called @obj.stub :right, false do @obj.stub :wrong, true do assert(@obj.invoke_function(''other'')) end end end end

La idea es apilar [method_expect_to_be_called] devolviendo un valor verdadero simple, y en el bloque de apéndice afirmar que se está llamando y devolviendo el valor verdadero . Apagar el otro método inesperado es solo asegurarse de que no se está llamando.

Nota: assert_send no funcionará correctamente. Consulte el ruby-doc.org/stdlib-2.0.0/libdoc/minitest/rdoc/MiniTest/… .

De hecho, la siguiente declaración será aprobada, pero no significa que esté funcionando como se esperaba:

assert_send([obj, :invoke_function, ''right'']) # it''s just calling invoke_function method, but not verifying any method is being called


Minitest tiene un .expect :call especial .expect :call para verificar si se llama a algún método.

describe SomeClass do it "should invoke right function" do mocked_method = MiniTest::Mock.new mocked_method.expect :call, return_value, [] some_instance = SomeClass.new some_instance.stub :right, mocked_method do some_instance.invoke_function("right") end mocked_method.verify end end

Lamentablemente esta característica no está muy bien documentada. Lo encontré desde aquí: https://github.com/seattlerb/minitest/issues/216