2010-01-15 11 views
10

tengo una ITransaction interfaz de la siguiente manera:miembros de C# que imita la interfaz de una clase concreta con Moq

public interface ITransaction { 

     DateTime EntryTime { get; } 

     DateTime ExitTime { get; } 
} 

y tengo una PaymentTransaction clase derivada de la siguiente manera:

public class PaymentTransaction : ITransaction { 

     public virtual DateTime LastPaymentTime 
     { 
      get { return DateTime.Now; } 
     } 

     #region ITransaction Members 

     public DateTime EntryTime 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public DateTime ExitTime 
     { 
      get { throw new NotImplementedException(); } 
     } 

     #endregion 
} 

yo quería burlarse de todo tres propiedades de PaymentTransaction Object.

He intentado lo siguiente, pero no funciona:

var mockedPayTxn = new Mock<PaymentTransaction>(); 
mockedPayTxn.SetUp(pt => pt.LastPaymentTime).Returns(DateTime.Now); // This works 

var mockedTxn = mockedPayTxn.As<ITransaction>(); 
mockedTxn.SetUp(t => t.EntryTime).Returns(DateTime.Today); 
mockedTxn.SetUp(t => t.ExitTime).Returns(DateTime.Today); 

pero cuando me inyecto

(mockedTxn.Object como PaymentTransaction)

en el método que estoy probando (como se solo toma una Transacción de pago y no una transacción IT, tampoco puedo cambiarla) el depurador muestra una referencia nula para la hora de entrada y la hora de salida.

Me preguntaba si alguien podría ayudarme, por favor.

Gracias de anticipación.

Respuesta

3

La única forma en que he podido evitar este problema (y se siente como un truco en ambos sentidos) es hacer lo que no desea hacer y hacer que las propiedades en la clase concreta sean virtuales (incluso para la implementación de la interfaz), o para implementar explícitamente la interfaz en su clase. Por ejemplo:

public DateTime EntryTime 
{ 
    get { return ((ITransaction)this).EntryTime; } 
} 

DateTime ITransaction.EntryTime 
{ 
    get { throw new NotImplementedException(); } 
} 

Entonces, cuando se crea el Mock, puede utilizar la sintaxis As<ITransaction>() y la maqueta se comportará como se espera.

0

Te estás burlando de una clase concreta, así que supongo que solo podrás burlar miembros que sean virtuales (deben ser reemplazables).

+0

Entiendo que me estoy burlando de una clase concreta, pero dado el hecho de que los accesorios del tiempo de entrada y salida son los miembros de la interfaz y estoy lanzando mi objeto de burlas concretas a la interfaz, no debería necesitar virtualizar estos accesorios. Me preguntaba si había alguna otra forma de hacerlo. – Raghu

+0

¿así que finalmente encontraste la respuesta? ¿Cómo lo hiciste? –

Cuestiones relacionadas