का उपयोग कर इंटरफ़ेस के लिए 'ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट ओबीजे)' का नकल कैसे करें मेरे पास अपने सिर को लपेटने में एक दिलचस्प समस्या है। इस तरह के कुछ इंटरफ़ेस पर विचार करें:Moq
public interface IMyThing
{
int Id { get; }
}
अब मैं इस इंटरफ़ेस का उपयोग करने वाले कोड का परीक्षण करना चाहता हूं। शायद कुछ LINQ जादू के साथ कुछ। कुछ इस तरह:
public class SomeClass
{
private IMyThing _thing;
...
public bool HasThing(IEnumerable<IMyThing> things)
{
return things.Contains(_thing);
}
}
मैं Moq
का उपयोग कर IMyThing
को लागू सभी वस्तुओं मजाक कर रहा हूँ:
public static IMyThing MockMyThing(int newId)
{
var mock = new Mock<IMyThing>();
mock.Setup(s => s.Id).Returns(newId);
mock.Setup(s => s.Equals(It.IsAny<object>())).Returns<object>(obj =>
{
if (typeof(IMyThing).IsAssignableFrom(obj.GetType()))
{
return ((IMyThing)obj).Id == newId;
}
return false;
});
return mock.Object;
}
यहाँ बात है। उपरोक्त कोड चेतावनियों के बिना संकलित करता है लेकिन कभी काम नहीं करेगा। Moq
Equals()
विधि के लिए एक इंटरसेप्टर बनाता है लेकिन यह कभी नहीं पहुंचता है। इसके बजाए, ऑब्जेक्ट प्रॉक्सी के बराबर विधि को बुलाया जाता है। मैं इस तथ्य को दोषी ठहरा रहा हूं कि मैं एक इंटरफेस का मज़ाक उड़ा रहा हूं लेकिन एक ठोस वर्ग नहीं।
अद्यतन: बस एहसास हुआ Moq
एक इंटरसेप्टर भी नहीं बनाता है।
बेशक मैं इस तरह IMyThing
इंटरफेस को बढ़ाने सकता है:
public interface IMyThing : IEquatable<IMyThing>
{
int Id { get; }
}
LINQ ऑपरेटर IEquatable<T>
इंटरफ़ेस समझते हैं और यह प्रयोग करेंगे।
मैं क्योंकि यह करने के लिए नहीं करना चाहती:
- यह अन्य
IMyThing
वस्तुओं IEquatable<T>
इस उद्देश्य के- मैं अपने मॉडल को कलंकित नहीं करना चाहती के लिए नहीं किया गया था के साथ ही प्रयोग करने योग्य है केवल इसे मॉक करने योग्य बनाने के लिए
आप इसे कैसे हल करेंगे?
यदि आप 'HasThing() 'विधि के दौरान कुछ जटिल परिदृश्यों का परीक्षण करने का प्रयास कर रहे हैं, तो शायद इसे' IENumerable 'स्वीकार करना चाहिए। क्यों नहीं "एक अतिरिक्त स्तर का संकेत" पेश करें? –