का उपयोग करके तृतीय पक्ष कॉलबैक ईवेंट का मज़ाक उड़ाते हुए हम सी # में लिखे गए वर्कर क्लास के लिए यूनिट परीक्षण लिखने का प्रयास कर रहे हैं, जो मोक ऑब्जेक्ट्स को गतिशील रूप से बनाने के लिए moq का उपयोग करके किसी तृतीय पक्ष API (COM आधारित) को मॉक करता है। NUnit हमारी यूनिट परीक्षण ढांचा है।moq
यह तीसरा पक्ष घटक कुछ इंटरफेस लागू करता है, लेकिन घटनाओं का उपयोग करके हमारे कार्यकर्ता वर्ग में वापस कॉल करने की भी आवश्यकता है। हमारी योजना उन घटनाओं को अनुकरण करना था जो इस तीसरे पक्ष के घटक को उठा सकते हैं, और परीक्षण करें कि हमारे कार्यकर्ता वर्ग ने अपेक्षा के अनुसार संचालित किया था।
दुर्भाग्यवश हम उस moq में एक समस्या में भाग गए हैं जो बाहर निकलने और उन घटनाओं को बढ़ाने में असमर्थ लगता है जो बाहरी रूप से परिभाषित किए गए हैं। दुर्भाग्यवश मैं उपयोग कर रहे सटीक तृतीय पक्ष एपीआई के लिए कोड प्रदान नहीं कर सकता, लेकिन हमने एमएस वर्ड एपीआई का उपयोग करके इस मुद्दे को फिर से बनाया है, और यह भी दिखाया गया है कि स्थानीय रूप से परिभाषित इंटरफेस का उपयोग करते समय परीक्षण कैसे काम करते हैं:
using Microsoft.Office.Interop.Word;
using Moq;
using NUnit.Framework;
using SeparateNamespace;
namespace SeparateNamespace
{
public interface LocalInterface_Event
{
event ApplicationEvents4_WindowActivateEventHandler WindowActivate;
}
}
namespace TestInteropInterfaces
{
[TestFixture]
public class Test
{
[Test]
public void InteropExample()
{
// from interop
Mock<ApplicationEvents4_Event> mockApp = new Mock<ApplicationEvents4_Event>();
// identical code from here on...
bool isDelegateCalled = false;
mockApp.Object.WindowActivate += delegate { isDelegateCalled = true; };
mockApp.Raise(x => x.WindowActivate += null, null, null);
Assert.True(isDelegateCalled);
}
[Test]
public void LocalExample()
{
// from local interface
Mock<LocalInterface_Event> mockApp = new Mock<LocalInterface_Event>();
// identical code from here on...
bool isDelegateCalled = false;
mockApp.Object.WindowActivate += delegate { isDelegateCalled = true; };
mockApp.Raise(x => x.WindowActivate += null, null, null);
Assert.True(isDelegateCalled);
}
}
}
कोई भी बता सकता है कि स्थानीय रूप से परिभाषित इंटरफ़ेस के लिए ईवेंट क्यों बढ़ाना है, लेकिन तीसरे पक्ष एपीआई (इस मामले में वर्ड) से आयात नहीं किया गया है?
मुझे एहसास है कि यह एक तथ्य है कि हम एक COM ऑब्जेक्ट (इंटरऑप असेंबली के माध्यम से) से बात कर रहे हैं लेकिन मुझे यकीन नहीं है कि समस्या के आसपास कैसे काम करना है।
ऐसा प्रतीत होता है कि यह बग मोक v4.0 में तय किया गया है: http://code.google.com/p/moq/issues/detail?id=226 –