2013-01-08 21 views
7

Próbuję przetestować moją usługę za pomocą ninject i jednostkowego projektu testowego z visual studio 2012. Moje wstrzyknięcie działa dobrze na moich kontrolerach, ale kiedy próbuję zrobić to samo w klasie testu jednostkowego I uzyskać Exception.Test jednostkowy z 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 
     } 
    } 
} 

myślę, że jest coś złego w zastrzyku, ale ja nie rozumiem.

Odpowiedz

9

Wydaje mi się, że jest to jedna z liter o numerze z_giftService. Ponadto należy użyć atrybutu [TestInitialize] w swoim konstruktorze.

Spróbuj następujący kod umieszczając prawidłową nazwę usługi _giftService - że kod jest wstrzykiwanie zamiast:

var list = __giftService.FindAll(); 

Edit: Testy jednostkowe powinny być wykonywane bez Ninject. Po prostu stwórz instancję badanego obiektu i wstrzyknij próbkę dla każdej zależności ręcznie.

Oto próbka z [TestInitialize]:

Test

Jednostka musi mieć domyślny konstruktora:

[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 to null. Twoja zmienna to _giftService. Powinieneś także użyć atrybutu [TestInitialize] dla swojego konstruktora.

Dodatkowa wskazówka:

Nie należy tworzyć żadnych zależności w swojej testów jednostkowych. Tak więc giftService, którego chcesz użyć, powinno być symulacją lub stubem.

3

Jedynym sposobem wtrysku zależność jest w stanie połączyć się z konstruktora i wypełnić go z parametr mający wartość jest taki, że jądro wtryskowe zależności jest tym, które tworzy instancję klasy.

W twoim przypadku MSTest tworzy twoją klasę testową, więc Ninject nie ma szansy zadzwonić do twojego konstruktora.

Szczerze mówiąc, robisz to w niewłaściwy sposób. Będziesz walczył z MSTestem, jeśli będziesz kontynuował to dalej, próbując uzyskać Ninject (lub dowolną inną frakcję DI), aby utworzyć instancje swoich klas testowych.

Polecam użyć "nowy", aby utworzyć egzemplarz badanej klasy (_giftService = new GiftService();). Jeśli ta klasa ma zależności w swoim konstruktorze, użyj ramki szyderczej, aby przekazać w fałszywej wersji tych zależności. W ten sposób izolujesz testy jednostek tylko do funkcji testowanej klasy.

Powiązane problemy