2013-01-08 19 views
7

के साथ यूनिट टेस्ट मैं दृश्य स्टूडियो 2012 के साथ निंजा और यूनिट टेस्ट प्रोजेक्ट का उपयोग करके अपनी सेवा का परीक्षण करने की कोशिश कर रहा हूं। मेरा इंजेक्शन मेरे नियंत्रकों पर ठीक काम करता है, लेकिन जब मैं यूनिट टेस्ट क्लास में ऐसा करने की कोशिश करता हूं I Exception प्राप्त करें।निनजेक इंस्टेंटिएट

System.NullReferenceException: Object reference not set to an instance of an object.

namespace Trex.UnitTests 
{ 
    [TestClass] 
    public class GiftServiceTests 
    { 
     private IGiftService _giftService; 

     public void GiftServiceTest(IGiftService giftService) 
     { 
      _giftService = giftService; 
     } 

     [TestMethod] 
     public void AddGift() 
     { 

      var list = _gift.FindAll(); <--- this line throw an exception 
     } 
    } 
} 

मुझे लगता है कि वहाँ कुछ इंजेक्शन के साथ गलत है, लेकिन मैं इसे पाने के नहीं है।

उत्तर

9

यह मुझे _giftService के टाइपो की तरह दिखता है। इसके अतिरिक्त, आपके निर्माता में [TestInitialize] विशेषता का उपयोग करने की आवश्यकता है।

सही सेवा का नाम _giftService रखकर निम्नलिखित कोड का प्रयास करें - जो आपके कोड के बजाय इंजेक्शन है:

var list = __giftService.FindAll(); 

संपादित करें: इकाई परीक्षण Ninject के बिना किया जाना चाहिए। बस परीक्षण के तहत ऑब्जेक्ट का एक उदाहरण बनाएं और प्रत्येक निर्भरता के लिए मैन्युअल रूप से एक नकली इंजेक्ट करें।

यहाँ [TestInitialize] के साथ एक नमूना है:

[TestClass] 
public class TestControllersHomeController 
{ 
    private HomeController _sut; 

    [TestInitialize] 
    public void MyTestInitialize() 
    { 
     var kernel = NinjectWebCommon.CreatePublicKernel(); 
     _sut = kernel.Resolve<HomeController>(); 
    } 

    [TestMethod] 
    public void TestIndex() 
    { 
     var result = _sut.Index(); 
     Assert.IsNotNull(result); 
    } 
} 
3

_giftnull है। आपका चर _giftService है। आपको अपने कन्स्ट्रक्टर के लिए [TestInitialize] विशेषता का भी उपयोग करना चाहिए।

अतिरिक्त युक्ति:

आप अपने इकाई परीक्षण में किसी भी निर्भरता नहीं बनाना चाहिए। तो giftService जिसे आप उपयोग करना चाहते हैं वह एक नकली या स्टब होना चाहिए।

3

एक ही रास्ता निर्भरता इंजेक्शन के साथ अपने निर्माता कॉल और इसे भरने में सक्षम है:

इकाई परीक्षण एक डिफ़ॉल्ट निर्माता होना आवश्यक है एक पैरामीटर जिसमें एक मान है यदि निर्भरता इंजेक्शन कर्नेल वह है जो आपकी कक्षा को तुरंत चालू करता है।

आपके मामले में, एमएसटीएस्ट आपकी टेस्ट क्लास को तुरंत चालू कर रहा है, इसलिए निनजेरे को आपके कन्स्ट्रक्टर को कॉल करने का मौका नहीं है।

ईमानदार होने के लिए, आप इस बारे में गलत तरीके से जा रहे हैं। यदि आप अपने परीक्षण कक्षाओं को तुरंत चालू करने के लिए निनजेक्ट (या कोई अन्य डी ढांचा) प्राप्त करने का प्रयास करने के लिए आगे बढ़ते हैं तो आप एमएसटीएस्ट से लड़ेंगे।

मैं आपको परीक्षण के तहत कक्षा को तुरंत चालू करने के लिए 'नया' उपयोग करने की सलाह दूंगा (_giftService = new GiftService();)। यदि उस वर्ग के अपने कन्स्ट्रक्टर में निर्भरता है, तो उन निर्भरताओं के मॉक किए गए संस्करण में पास करने के लिए एक मॉकिंग फ्रेमवर्क का उपयोग करें। इस तरह आप परीक्षण के तहत कक्षा की कार्यक्षमता के लिए अपने यूनिट परीक्षणों को अलग करते हैं।