c# 單元測試c#範例 - 使用IoC進行單元測試




c#單元測試資料庫 網站單元測試 (5)

使用能夠解析像SimpleInjector這樣的未註冊/未知服務的SimpleInjectorDryIoc (它的礦井)可以為尚未實現的接口返回DryIoc

這意味著你可以通過第一個簡單的實現和模擬的依賴關係開始開發,並在進展時用真實的東西替換它們。

IoC容器如何用於單元測試? 在使用IoC的巨大解決方案(50多個項目)中管理模擬有用嗎? 任何經驗? 任何C#庫在單元測試中都能很好地使用它?


我經常在測試中使用IoC容器。 當然,它們不是純粹意義上的“單元測試”。 IMO他們更BDDish並促進重構。 測試在那裡給你信心重構。 寫得不好的測試可能就像在你的代碼中註入水泥。

考慮以下:

[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);
    }
}

將圖像添加到圖庫時會發生幾件事情。 圖像被調整大小,生成縮略圖,文件存儲在AmazonS3上。 通過使用容器,我可以更容易地隔離我想要測試的行為,在這種情況下,這是持久性部分。

自動模擬容器擴展在使用這種技術時派上用場: http://www.agileatwork.com/auto-mocking-unity-container-extension/ : http://www.agileatwork.com/auto-mocking-unity-container-extension/


如何使用Ioc容器進行單元測試?

IoC將執行編程範例,這將使單元測試更加簡單:使用接口,不使用新(),不使用單例...

但使用IoC容器進行測試並不是一個必要條件,它只會提供一些設施,例如注入mock,但您可以手動完成。

在使用IoC的巨大解決方案(50多個項目)中管理模擬有用嗎?

我不確定你使用IoC來管理模擬的意思。 無論如何,IoC容器通常不僅僅是在測試時注入模擬。 如果你有體面的IDE支持,使重構成為可能,為什麼不使用它?

任何經驗?

是的,在一個巨大的解決方案中,您比以往任何時候都更需要一個不容易出錯和重構的逆向解決方案(即通過類型安全的IoC容器或良好的IDE支持)。


一般來說,單元測試不需要DI容器,因為單元測試都是關於分離職責的。

考慮一個使用構造函數注入的類

public MyClass(IMyDependency dep) { }

在你的整個應用程序中,可能有一個隱藏在IMyDependency後面的巨大依賴關係圖,但在單元測試中,你將它全部IMyDependency到單個測試雙 IMyDependency

您可以使用像Moq或RhinoMocks這樣的動態模擬來生成測試雙精度,但這不是必需的。

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

在某些情況下, 自動模擬容器可能很好,但您不需要使用生產應用程序使用的同一個DI容器。


免費的Python書籍Dive Into Python有一章關於你可能會覺得有用的單元測試

如果你遵循現代實踐,你應該在寫作你的項目時寫下測試,而不要等到你的項目接近完成。

現在有點晚了,但現在你知道下一次。 :)





c# unit-testing mocking inversion-of-control