Moq

2010-01-15 13 views
10

के साथ एक ठोस वर्ग की ग # मजाक इंटरफ़ेस सदस्यों के रूप में निम्नानुसार मैं एक अंतरफलक ITransaction है:Moq

public interface ITransaction { 

     DateTime EntryTime { get; } 

     DateTime ExitTime { get; } 
} 

और मैं एक व्युत्पन्न वर्ग PaymentTransaction इस प्रकार है:

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 
} 

मैं सभी उपहास करने के लिए करना चाहता था PaymentTransaction ऑब्जेक्ट के तीन गुण।

मैं निम्नलिखित की कोशिश की है, लेकिन यह काम नहीं करता:

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

लेकिन जब मैं ((PaymentTransaction रूप mockedTxn.Object)

विधि मैं परीक्षण कर रहा हूँ में

इंजेक्षन यह के रूप में केवल भुगतान लेनदेन लेता है और आईट्रांसैक्शन नहीं, मैं इसे भी नहीं बदल सकता) डीबगर प्रवेश समय और बाहर निकलने के समय के लिए शून्य संदर्भ दिखाता है।

मैं सोच रहा था कि कोई मेरी मदद कर सकता है या नहीं।

प्रत्याशा में धन्यवाद।

उत्तर

3

एकमात्र तरीके मैं इस मुद्दे के आसपास पहुंचने में सक्षम हूं (और यह एक हैक की तरह लगता है) ऐसा करने के लिए है जो आप नहीं करना चाहते हैं और कंक्रीट क्लास वर्चुअल पर गुण भी बना सकते हैं (यहां तक ​​कि इसके लिए भी इंटरफेस कार्यान्वयन), या अपनी कक्षा पर इंटरफेस को स्पष्ट रूप से कार्यान्वित करने के लिए। उदाहरण के लिए:

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

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

तब, जब आप अपने नकली बनाते हैं, आप As<ITransaction>() सिंटैक्स का उपयोग कर सकते हैं और आपकी अपेक्षा के नकली व्यवहार करेगा।

0

आप एक ठोस वर्ग का मज़ाक उड़ा रहे हैं, इसलिए मुझे लगता है कि आप केवल उन सदस्यों को नकल करने में सक्षम होंगे जो आभासी हैं (वे अतिसंवेदनशील होना चाहिए)।

+0

मैं समझता हूं कि मैं एक ठोस वर्ग का मज़ाक उड़ा रहा हूं, लेकिन इस तथ्य को देखते हुए कि प्रवेश और निकास समय प्रोप इंटरफ़ेस सदस्य हैं और मैं इंटरफ़ेस में अपनी ठोस मॉक ऑब्जेक्ट कास्टिंग कर रहा हूं, मुझे इन प्रोप वर्चुअल बनाने की आवश्यकता नहीं है। मैं बस सोच रहा था कि ऐसा करने का कोई और तरीका है या नहीं। – Raghu

+0

तो क्या आपको अंत में जवाब मिल गया? तुमने ये कैसे किया? –