簡體   English   中英

將Moq與溫莎城堡配合使用

[英]Using Moq With Castle Windsor

我正在嘗試使用Moq對家庭控制器進行簡單的單元測試,但是我遇到了一個例外

'Castle.MicroKernel.ComponentNotFoundException'發生在Castle.Windsor.dll中,但未在用戶代碼中處理。 找不到支持服務OrderTrackingSystem.Core.Repositories.IRepository的組件

在我的HomeController中的_repository = MvcApplication.Container.Resolve<IRepository>()

private IRepository _repository;
_repository = MvcApplication.Container.Resolve<IRepository>();

public HomeController(IRepository repository)
{
     _repository = repository;
}

這是我的單元測試代碼。

[TestClass]
public class HomeControllerTests
{
    private Mock<IRepository> _repositoryMock;

    [TestInitialize]
    public void TestSetup()
    {
        _repositoryMock = new Mock<IRepository>();
    }

    [TestMethod]
    public void HomeControllerIndexReturnsAView()
    {
        // Arrange
        var controller = new HomeController(_repositoryMock.Object);

        // Act
        var result = controller.Index() as ViewResult;

        // Assert
        Assert.IsNotNull(result);
    }
}

我覺得我在單元測試中注冊或設置存儲庫一定會丟失一些簡單的東西。 有任何想法嗎?

我沒有使用Castle Windsor,但是看着您的控制器,它似乎正在使用構造函數注入來提供控制器依賴項。 教程建議,通常使用Windsor的方法是創建一個從DefaultControllerFactory派生的ControllerFactory,該ControllerFactory在內部使用內核來解析控制器的依賴關系。 這似乎可以確認代碼中的這一行是多余的:

_repository = MvcApplication.Container.Resolve<IRepository>();

因此,您的代碼應該只是:

private IRepository _repository;

// The repository is being created + injected by Windsor.
// If this wasn't correctly wired up already, you'd be getting errors
// indicating that your HomeController didn't have a default constructor...
public HomeController(IRepository repository)
{
     _repository = repository;
}

刪除對Resolve的調用后,您應該能夠如前所述將模擬依賴項從單元測試注入類中。

在某些情況下,您可能需要從控制器工廠外部訪問Windsor內核以解決依賴關系,但它們之間應該相去甚遠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM