सत्यापन के साथ Moq का उपयोग करते समय, यह कहने के लिए कि निर्दिष्ट पैरामीटर के साथ एक निश्चित विधि को बुलाया गया है, विभिन्न प्रकार के वाक्यविन्यास संभव है; इसMoq इसके बिना सत्यापित करें - किस तरह की तुलना करें?
mock.Verify(c => c.SomeMethod(It.Is<string>(s => s == ExpectedString)));
यहाँ क्या होता है कि पैरामीटर कि SomeMethod
साथ कहा जाता है, ExpectedString
साथ समानता के लिए जाँच की है की तरह है, "यह" वाक्य रचना है। एक और संभावित वाक्यविन्यास "यह" के बिना है:
mock.Verify(c => c.SomeMethod(ExpectedString));
जो एक ही परिणाम देना चाहिए। जो कुछ मैं विभिन्न मंचों पर खोजने में सक्षम हूं, अंतर यह है कि उत्तरार्द्ध एक पहचान जांच (संदर्भ बराबर) है (मूल्य प्रकारों को छोड़कर)।
हालांकि, मेरा प्रश्न यह है कि पैरामीटर एक प्रकार का संग्रह प्रकार है। नेट में, Equals
Collection<T>
पर सिर्फ object
से विरासत में मिला है, इसलिए यह सत्यापित करें:
mock.Verify(c => c.SomeMethod(new Collection<string> { ExpectedString }));
पारित करने के लिए संभव है, यह देखते हुए कि संग्रह की पुष्टि में instantiated है नहीं होना चाहिए, और इस तरह नहीं संभवतः एक ही उदाहरण हो सकता है यह उत्पादन कोड में तत्काल है। फिर भी, यह काम करता है, जो इंगित करता है कि मोक एक संग्रह एएसएसर्ट या ऐसा कुछ करता है, जो मुझे मिली जानकारी के विपरीत।
यहां एक कोड उदाहरण है जो व्यवहार को दिखाता है, परीक्षण पास होता है, लेकिन मुझे लगता है कि यदि मोक ने संदर्भ का उपयोग किया था तो यह असफल होना चाहिए।
[TestMethod]
public void Test()
{
var mock = new Mock<IPrint>();
const int ExpectedParam = 1;
var test = new TestPrinter { Printer = mock.Object, Expected = ExpectedParam };
test.Do();
mock.Verify(c => c.Print(new Collection<int> { ExpectedParam }));
}
public interface IPrint
{
void Print(Collection<int> numbers);
}
public class TestPrinter
{
public IPrint Printer { get; set; }
public int Expected { get; set; }
public void Do()
{
Printer.Print(new Collection<int> { Expected });
}
}
क्या किसी को पता है कि यह मोक (संस्करण 4.1) का व्यवहार अपेक्षित है? व्यवहार कुछ संस्करण स्तर पर बदल गया था?