2013-01-08 3 views
7

Sto provando a testare il mio servizio usando il progetto ninject e un test unitario con visual studio 2012. Il mio inject funziona bene sui miei controller, ma quando provo a fare lo stesso nella unit test class I prendi un Exception.Test unitario con Ninject Instantiate

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 
     } 
    } 
} 

penso che ci sia qualcosa di sbagliato con l'iniezione, ma io non farlo.

risposta

9

Mi sembra un errore di_giftService. Inoltre, l'attributo [TestInitialize] deve essere utilizzato nel costruttore.

provare il seguente codice inserendo il nome del servizio corretto _giftService - che il codice sta iniettando invece:

var list = __giftService.FindAll(); 

Edit: Unit testing dovrebbe essere fatto senza Ninject. Basta creare un'istanza dell'oggetto sotto test e iniettare manualmente una simulazione per ogni dipendenza.

Ecco un campione con [TestInitialize]:

prova

L'unità deve avere un predefinito costruttore:

[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

_gift è null. La tua variabile è _giftService. Dovresti anche usare l'attributo [TestInitialize] per il tuo costruttore.

punta Extra:

Non dovrebbe creare dipendenze nel vostro unit test. Quindi lo giftService che si desidera utilizzare dovrebbe essere un mock o uno stub.

3

L'unico modo iniezione di dipendenza è in grado di chiamare il costruttore e riempirlo con un parametro che ha un valore è se il kernel di integrazione delle dipendenze è quello che istanzia la tua classe.

Nel tuo caso, MSTest crea un'istanza della classe di test, quindi Ninject non ha la possibilità di chiamare il tuo costruttore.

Per essere onesti, stai andando in questo modo nel modo sbagliato. Combatterai MSTest se prosegui ulteriormente nel tentativo di ottenere Ninject (o qualsiasi altro framework DI) per istanziare le tue classi di test.

Si consiglia di utilizzare "nuovo" per creare un'istanza della classe sottoposta a test (_giftService = new GiftService();). Se quella classe ha delle dipendenze nel suo costruttore, usa una struttura di simulazione per passare in versione derisoria di quelle dipendenze. In questo modo si isolano i test unitari solo alla funzionalità della classe sottoposta a test.