2010-07-02 14 views
6

मेरे पास एक क्लास ए है जिसमें निम्न है:एमओएफ एक एमईएफ आयात?

public class A { 
    [Import(typeof(IMyService)] 
    public IMyService MyService { get; set; } 

    public A() { 
     CompositionInitializer.SatisfyImports(this); 
    } 

    public void DoWork() { 
     //Blah 
     MyService.DoIt(); 
     //Blah 
    } 
} 

और यह परीक्षण करने के लिए एक टेस्ट (अलग डीएल - स्पष्ट रूप से)

[TestMethod] 
public void TestDoWork() { 
    //Blah 
    DoWork(); 
    //Assert assert 
} 

यह 'MyService' को कॉल करने का प्रयास करने में विफल रहता है मुझे शून्य देता है। मैंने तब कोशिश की है:

[ClassInitialize] 
public void InitialiseClass() { 
    var myService = new Mock<IMyService>(); 
    MyService = myService.Object; 
} 

'MyService' के साथ घोषित किया गया है:

[Export(typeof(IMyService))] 
public IMyService MyService { get; set; } 

लेकिन अभी भी कोई खुशी नहीं है, क्या मुझे कुछ याद आ रहा है - क्या यह भी संभव है?

मैं एसएल 3, एमईएफ पूर्वावलोकन 9 और MOQ का उपयोग कर रहा हूँ।

किसी भी मदद की सराहना की!

चीयर्स

क्रिस

उत्तर

4

आपका वर्ग इस तरह दिखना चाहिए:

public class A 
{ 
    private readonly IMyService _myService; 

    [ImportingConstructor] 
    public A(IMyService myService) 
    { 
     _myService = myService; 
    } 

    public void DoWork() { 
     //Blah 
     _myService.DoIt(); 
     //Blah 
    } 
} 

और अपने परीक्षण इस तरह दिखना चाहिए:

[TestMethod] 
public void DoWork_invokes_IMyService_DoIt() 
{ 
    // arrange mock and system under test 
    var myService = new Mock<IMyService>(); 
    var a = new A(myService.Object); 

    // act  
    a.DoWork(); 

    // assert that DoIt() was invoked 
    myService.Verify(x => x.DoIt()); 
} 

तथ्य यह है कि आप का उपयोग MEF इकाई परीक्षण में महत्वपूर्ण नहीं होना चाहिए। एमईएफ केवल कई घटकों को तारों के साथ खेलते समय खेलता है, जो इकाई परीक्षण में क्या होता है इसके बिल्कुल विपरीत है। एक इकाई परीक्षण परिभाषा द्वारा अलगाव में एक घटक का परीक्षण है।

संपादित: यदि आप संपत्ति इंजेक्शन पसंद करते हैं, तो अपने वर्ग एक निर्माता और अपने इकाई परीक्षण में व्यवस्था भाग की जरूरत नहीं है इस के बजाय तरह दिखना चाहिए:

var myService = new Mock<IMyService>(); 
    var a = new A(); 
    a.MyService = myService.Object; 
+0

ठीक है, लेकिन मुझे कन्स्ट्रक्टर आयातक का उपयोग करने की आवश्यकता क्यों है, संपत्ति मेरे वास्तविक कार्यान्वयन में ठीक काम कर रही है, संभवतः उन प्रकार के आयातों को नकल करने में सक्षम होने का एक मार्ग है? –

+1

@ क्रिस: हालांकि एमईएफ संपत्ति इंजेक्शन को प्रोत्साहित करता है, मैं निर्माण इंजेक्शन पसंद करता हूं क्योंकि इस तरह से संकलक आपको लापता निर्भरताओं के साथ वस्तुओं को बनाने से रोकता है। यह आपको निर्भरता फ़ील्ड को केवल पढ़ने की अनुमति देता है, इसलिए आपको इस बारे में सोचना नहीं है कि निर्भरता बदलने के बाद क्या होता है। –

+0

मैंने इस विधि का चयन किया है, व्यक्तिगत रूप से मैं अभी भी जानना चाहता हूं कि क्या आप संपत्ति इंजेक्शन का नकल कर सकते हैं, लेकिन इससे मेरे पास इस मुद्दे को ठीक करने में मदद मिलती है। चीयर्स। –

1

कहाँ आप अपने IMyService उदाहरण के लिए [निर्यात] जोड़ दिया है, आप वास्तव में जोड़ लिया है रचना कंटेनर के लिए है? यदि नहीं, तो यह संरचना में हिस्सा नहीं लेगा। कंटेनर में एक मज़ाक उड़ाया वस्तु को जोड़ने के लिए, निम्न करें:

container.ComposeExportedValue<IMyService>(mock.Object); 

या बस:

container.ComposeExportedValue(mock.Object); // type inference. 

ऐसा करने से पहले आपके द्वारा बनाया गया एक का एक उदाहरण यह सक्षम हो जाएगा अपने एक के अंदर बना जा उदाहरण।

+0

मैं एक कंटेनर के लिए ठोस कार्यान्वयन को जोड़ने के लिए यह काम करने के लिए प्राप्त करने की आवश्यकता नहीं है। लेकिन मैं आपकी बात देखता हूँ। आप कंटेनर कहां देख रहे हैं? –

0

आप फायरिंग नहीं की जानी चाहिए अपने यूनिट परीक्षण में एमईएफ ऊपर। संरचना यूनिट टेस्ट के दायरे से परे है, आईओसी कंटेनर के विपरीत नहीं।

मैन्युअल Insted, आप आवश्यक इंजेक्षन चाहिए निर्भरता:

[TestClass] 
public class ATest { 
    Mock<IMyService> myService ; 
    [TestInitialize] 
    public void InitialiseClass() { 
    myService = new Mock<IMyService>(); 
    } 

    [TestMethod] 
    public void DoWorkShouldCallDoIt { 
    A a = new A(); 
    a.MyService = myService.Object; 
    a.DoWork(); 
    myService.Verify(m=>m.DoIt(), Times.Once()); 
    } 
} 
संबंधित मुद्दे