Estoy leyendo Clean Code: A Handbook of Agile Software Craftsmanship
y uno de los ejemplos implica una clase Portfolio
y una clase TokyoStockExchange
. Sin embargo, Portfolio
no es muy comprobable porque depende de TokyoStockExchange
como una API externa para determinar el valor de la cartera y tal es una búsqueda bastante volátil y no propicia para las pruebas.Confundido acerca de por qué es útil para probar los objetos ficticios
Por lo tanto, resuelven esto creando una interfaz StockExchange
común y tienen TokyoStockExchange
y DummyStockExchange
ambos implementan la clase base. Por lo tanto, se logra el principio de inversión de dependencia y en la clase PortfolioTest
se puede crear una instancia de DummyStockExchange
, fijar un precio de stock en una corporación, asignar la instancia DummyStockExchange
a la cartera y agregar algunas acciones de esa compañía a la cartera y luego confirmar si el el valor esperado es de hecho el valor adecuado. Aquí está el código:
public class PortfolioTest
{
private DummyStockExchange exchange;
private Portfolio portfolio;
protected void setUp()
{
exchange = new DummyStockExchange();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
public void GivenFiveMSFTTotalShouldBe500()
{
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}
Mi pregunta, simplemente, es la razón por ?
Intentamos probar si la clase TokyoStockExchange
funcionaba en conjunto con la clase Portfolio
. Obviamente, si creamos otra clase con un nuevo método que establece un precio de acciones y le damos a la cartera cinco de esas acciones, todo funcionará. Simplemente parece ... inútil probarlo. Entiendo que TokyoStockExchange
es básicamente imposible de probar con Portfolio
debido a los cambios en los precios de las acciones, pero no entiendo cómo sustituir en una prueba más bien inútil ayuda a la situación.
Parece como si no supiéramos si nuestros programas de sumadores funcionan pero los únicos números disponibles se generan de forma aleatoria, por lo que creamos una clase ficticia que nos da 2 y probamos 2 + 2 = 4
. Bueno, sí, obviamente eso es verdad. Todavía podemos romper TokyoStockExchange
y la prueba seguirá teniendo éxito porque está probando otra clase. En todo caso, todo esto parece engañoso y también resulta en tener que escribir código adicional solo para probar algo que sabemos que va a funcionar.
Creo que este es el problema más grande que tengo con la comprensión de la Unidad de Pruebas en este momento. Sé que estoy equivocado, creo que no pude ver la luz. Espero que alguien pueda ayudarme.
Como referencia ... si está probando que 'TokyoStockExchange' funciona * con *' Portfolio', se encuentra fuera del alcance de las pruebas unitarias. 'Portfolio' y' TokyoStockExchange' son unidades, y las pruebas unitarias están destinadas a probar cada * unidad * por separado de tantas otras como sea posible (preferiblemente todas). La interacción entre ellos es lo que * pruebas de integración * cubren. – cHao
+1 para tratar de comprender el valor en lugar de deshacerse de las pruebas unitarias con "es más trabajo mantener ese código también" –
Esto es realmente más una pregunta para [programadores.se]. –