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 fuenteclass 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