2010-01-28 12 views
5

Al trabajar con objetos de dominio, ¿cómo suele probar la unidad un método que llama a otro método en el objeto? Por ejemplo:Cómo probar métodos que llaman a otros métodos en un objeto de dominio

public class Invoice 
{ 
    public IList<InvoiceLine> InvoiceLines; 
    public string Company; 
    public bool IsDiscounted; 
    public DateTime InvoiceDate; 
    //... 
    public GetTotalAmt(); 
    public GetExtendedTotalAmt(); 

    public decimal GetTotalAmt() 
    { 
    decimal total; 
    foreach (InvoiceLine il in InvoiceLines) 
    { 
     total += il.Qty * il.Price; 
    } 
    return total; 
    } 

    public decimal GetExtendedTotalAmt() 
    { 
    decimal discount; 
    if (IsDiscounted) 
     discount = .05M; 
    return GetTotalAmt() * discount; 
    } 
} 

Unidad de prueba GetTotalAmt() es fácil, pero con GetExtendedTotalAmt() tendría que utilizar los objetos stub/InvoiceLine simulados para hacer que funcione, cuando todo lo que realmente quiero hacer es la prueba de que una el descuento se aplica si la bandera IsDiscounted es verdadera.

¿Cómo lo manejan otras personas? No creo que tenga sentido dividir el objeto de dominio, ya que estos métodos se consideran parte de la funcionalidad básica de Factura (y dividirla probablemente haga que los desarrolladores llamen al método incorrecto con más frecuencia).

Gracias!

Respuesta

1

Me gustaría construir una situación que es tan simple como sea posible: sólo un InvoiceLine con una cantidad y precio de 1.

Algo de esta manera:

invoice.Add(new InvoiceLine(new Article("blah", 1M), 1)); 

Assert.AreEqual(0.95M, invoice.GetExtendedTotalAmt()); 

Cuando ve que esto se vuelve bastante complicado, encuentra errores se pone difícil, etc., entonces es una señal de que debe dividir la clase (hacer que los cálculos en la factura sean una estrategia o algo similar). Pero mientras sea tan simple como tu parte del código aquí, no me preocuparía.

3

Se podría hacer que el método GetTotalAmtvirtual y luego:

var sut = new MockRepository().PartialMock<Invoice>(); 
sut.Expect(x => x.GetTotalAmt()).Return(10); 
sut.Replay(); 

var result = sut.GetExtendedTotalAmt(); 
+0

¿Ese rinoceronte se burla? –

+0

Sí, el rinoceronte se burla, lo siento, debería haberlo mencionado. –

+0

Es una forma bastante intrusiva porque muchos métodos deben ser virtuales, las clases no están selladas, etc. –

Cuestiones relacionadas