Wykorzystanie IoC do testów jednostkowych

Jak kontener IoC może być używany do testów jednostkowych? Czy warto zarządzać mockami w ogromnym rozwiązaniu (ponad 50 projektów) za pomocą IoC? Jakieś doświadczenia? Jakies biblioteki C#, ktore dzialaja dobrze za Uzywanie go w testach jednostkowych?

Author: Ruben Bartelink, 2009-09-23

4 answers

Ogólnie Rzecz Biorąc, kontener DI nie powinien być konieczny do testowania jednostkowego, ponieważ testowanie jednostkowe polega na rozdzieleniu obowiązków.

Rozważmy klasę, która używa konstruktora

public MyClass(IMyDependency dep) { }

W całej aplikacji może być tak, że ukryty jest ogromny wykres zależności IMyDependency, ale w teście jednostkowym spłaszczysz to wszystko do jednego podwójnego testu.

Możesz użyć dynamicznych moków, takich jak Moq lub RhinoMocks, aby wygenerować Test Double, ale jest to nie jest wymagane.

var dep = new Mock<IMyDependency>().Object;
var sut = new MyClass(dep);

W niektórych przypadkach, kontener auto-mocking może być przyjemny, ale nie trzeba używać tego samego kontenera DI, którego używa aplikacja produkcyjna.

 119
Author: Mark Seemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-14 07:32:22

Jak kontener Ioc może być używany do testów jednostkowych?

IoC wymusi paradygmaty programowania, które ułatwią Testowanie jednostek w izolacji (np. przy użyciu mocks): użycie interfejsów, brak new (), brak singletonów...

Ale używanie kontenera IoC do testowania nie jest tak naprawdę wymogiem, zapewni tylko pewne udogodnienia, np. Wtrysk moków, ale można to zrobić ręcznie.

Czy warto zarządzać mockami w ogromnym rozwiązaniu (ponad 50 projektów) za pomocą MKOl?

Nie jestem pewien, co masz na myśli, zarządzając mockami za pomocą IoC. W każdym razie kontenery IoC mogą Zwykle robić więcej niż tylko wstrzykiwanie moków, jeśli chodzi o testowanie. A jeśli masz przyzwoitą obsługę IDE, która umożliwia refaktoryzację, dlaczego jej nie użyć?

Jakieś doświadczenie?

Tak, w przypadku ogromnego rozwiązania potrzebujesz bardziej niż kiedykolwiek rozwiązania nie podatnego na błędy i niekorzystnego na refaktoryzację (np. poprzez bezpieczny kontener IoC lub dobrą obsługę IDE).

 16
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 13:32:58

Często używam kontenera IoC w moich testach. Oczywiście, nie są to "testy jednostkowe" w czystym sensie. IMO są bardziej BDDish i ułatwiają refaktoryzację. Testy są po to, aby dać ci pewność refactor. Źle napisane testy mogą być jak wlewanie cementu do kodu.

Rozważ co następuje:

[TestFixture]
public class ImageGalleryFixture : ContainerWiredFixture
{
    [Test]
    public void Should_save_image()
    {
        container.ConfigureMockFor<IFileRepository>()
            .Setup(r => r.Create(It.IsAny<IFile>()))
            .Verifiable();

        AddToGallery(new RequestWithRealFile());

        container.VerifyMockFor<IFileRepository>();
    }

    private void AddToGallery(AddBusinessImage request)
    {
        container.Resolve<BusinessPublisher>().Consume(request);
    }
}

Jest kilka rzeczy, które dzieją się podczas dodawania obrazu do galerii. Obraz jest zmieniany, generowana jest miniatura, a pliki są przechowywane na AmazonS3. Za pomocą kontener mogę łatwiej wyizolować tylko zachowanie, które chcę przetestować, co w tym przypadku jest utrzymującą się częścią.

Przy użyciu tej techniki przydatne jest automatyczne rozszerzenie kontenera: http://www.agileatwork.com/auto-mocking-unity-container-extension/

 14
Author: Mike Valenty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-10 15:14:45

Używanie kontenerów z możliwością rozwiązywania niezarejestrowanych / uknown usług, takich jak SimpleInjector, DryIoc (jego kopalnia) może zwracać mocki dla jeszcze nie zaimplementowanych interfejsów.

Co oznacza, że można rozpocząć rozwój od pierwszej prostej implementacji i jej wyśmiewanych zależności, a w miarę postępów zastąpić je rzeczywistymi.

 2
Author: dadhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 13:53:09