2010-01-15 28 views
10

Tôi có một ITransaction giao diện như sau:thành viên C# Mocking Giao diện của một lớp bê tông với Moq

public interface ITransaction { 

     DateTime EntryTime { get; } 

     DateTime ExitTime { get; } 
} 

và tôi có một lớp PaymentTransaction có nguồn gốc như sau:

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 
} 

tôi muốn Mock tất cả ba thuộc tính của đối tượng PaymentTransaction.

Tôi đã thử những điều sau đây, nhưng nó không làm việc:

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

nhưng khi tôi tiêm

(mockedTxn.Object như PaymentTransaction)

trong phương pháp Tôi đang thử nghiệm (vì nó chỉ mất một PaymentTransaction và không ITransaction, tôi không thể thay đổi nó hoặc là) trình gỡ lỗi cho thấy tham chiếu null cho thời gian nhập cảnh và thời gian xuất cảnh.

Tôi đã tự hỏi liệu có ai đó có thể giúp tôi không.

Cảm ơn bạn đã dự đoán.

Trả lời

3

Cách duy nhất tôi có thể giải quyết vấn đề này (và nó giống như là hack một trong hai cách) là làm những gì bạn không muốn làm và làm cho các thuộc tính trên lớp bê tông ảo (ngay cả đối với triển khai giao diện) hoặc cũng triển khai rõ ràng giao diện trên lớp của bạn. Ví dụ:

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

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

Sau đó, khi bạn tạo Mock, bạn có thể sử dụng cú pháp As<ITransaction>() và giả sẽ cư xử như bạn mong đợi.

0

Bạn đang chế nhạo một lớp cụ thể, vì vậy tôi đoán bạn sẽ chỉ có thể giả mạo các thành viên ảo (chúng phải được ghi đè).

+0

Tôi hiểu rằng tôi đang chế nhạo một lớp cụ thể, nhưng thực tế là đạo cụ thời gian nhập cảnh và xuất cảnh là các thành viên giao diện và tôi đang đúc đối tượng được chế tạo cụ thể của mình vào giao diện, tôi không cần phải thực hiện các đạo cụ ảo này. Tôi đã tự hỏi liệu có cách nào khác để làm điều này không. – Raghu

+0

vì vậy bạn có tìm thấy câu trả lời cuối cùng không? Bạn đã làm nó như thế nào? –

Các vấn đề liên quan