El problema ocurre al hacer TDD. Después de un par de pasadas de prueba, los tipos de retorno de alguna clase / módulo cambian. En un lenguaje de programación de tipo estático, si se utilizó un objeto simulado anterior en las pruebas de otra clase y no se modificó para reflejar el cambio de tipo, se producirán errores de compilación.
Sin embargo, para lenguajes dinámicos, el cambio en los tipos de retorno podría no detectarse y las pruebas de la otra clase aún pasarán. Claro que podría haber pruebas de integración que deberían fallar más adelante, pero las pruebas unitarias pasarían erróneamente. ¿Hay alguna forma de evitar esto?
Actualización con una muestra trivial (en un lenguaje inventado) ...
Versión 1:
Calc = {
doMultiply(x, y) {return x * y}
}
//.... more code ....
// On some faraway remote code on a different file
Rect = {
computeArea(l, w) {return Calc.doMultipy(x*y)}
}
// test for Rect
testComputeArea() {
Calc = new Mock()
Calc.expect(doMultiply, 2, 30) // where 2 is the arity
assertEqual(30, computeArea)
}
Ahora, en la versión 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect arrojará una excepción en el tiempo de ejecución, pero la prueba aún tendrá éxito.
class X
, sino de las pruebas de lasclass Y
cuales dependeX
y, por lo tanto, se prueba con un contrato diferente al que se ejecuta en la producción.