2010-01-15 12 views
10

Ich habe eine Schnittstelle ITransaction wie folgt:C# Mocking Schnittstelle Mitglieder einer konkreten Klasse mit Moq

public interface ITransaction { 

     DateTime EntryTime { get; } 

     DateTime ExitTime { get; } 
} 

und ich habe eine abgeleitete Klasse PaymentTransaction wie folgt:

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 
} 

Ich wollte alle Mock drei Eigenschaften des PaymentTransaction-Objekts.

Ich habe folgende versucht, aber es funktioniert nicht:

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); 

aber wenn ich einzuspritzen

(mockedTxn.Object als PaymentTransaction)

bei dem Verfahren I (wie es am Testen Nimmt nur eine PaymentTransaction und nicht ITransaction, ich kann es auch nicht ändern) der Debugger zeigt Null Referenz für Eintrittszeit und Austrittszeit.

Ich fragte mich, ob jemand mir bitte helfen könnte.

Vielen Dank im Voraus.

Antwort

3

Die einzige Möglichkeit, um dieses Problem zu umgehen (und es fühlt sich an wie ein Hack oder so) ist entweder tun, was Sie nicht tun möchten und die Eigenschaften auf der konkreten Klasse virtuell (sogar für die Schnittstellenimplementierung) oder auch die Schnittstelle in Ihrer Klasse explizit implementieren. Zum Beispiel:

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

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

Dann, wenn Sie Ihre Mock erstellen, können Sie die As<ITransaction>() Syntax verwenden und das Mock verhält sich wie erwartet.

0

Sie verspotten eine konkrete Klasse, also werden Sie nur virtuelle Mitglieder vortäuschen können (sie müssen übersteuerbar sein).

+0

Ich verstehe, dass ich eine konkrete Klasse verspotten, aber angesichts der Tatsache, dass Einlass und Ausfahrt Requisiten sind die Schnittstelle Mitglieder und ich bin mein konkretes verspottetes Objekt zu Schnittstelle Gießen, ich sollte diese Requisiten nicht virtuell machen. Ich habe mich nur gefragt, ob es eine andere Möglichkeit gibt, dies zu tun. – Raghu

+0

also hast du endlich die antwort gefunden? wie hast du es gemacht? –

Verwandte Themen