首页 > 解决方案 > 如何正确模拟调用不同项目中实现依赖注入的方法的控制器?

问题描述

我有一个以这种方式构建的解决方案

>Solution
>>BusinessLogic.proj
>>DataAccessLayer.proj
>>Domain.proj
>>Web.proj
>>Test.proj

Web.UserController

public class UserController
{
    private readonly IUserManager _userManager;

    public UserController(IUserManager userManager)
    {
        _userManager = userManager;
    }

    public string GetUser()
    {
        return _userManager.GetAllUsers();
    }
}

业务逻辑用户管理器

public class UserManager : IUserManager
{
    private readonly IUserQueryMaster _userQueryMaster;

    public UserManager(IUserQueryMaster userQueryMaster)
    {
        _userQueryMaster = userQueryMaster;
    }
    public string GetAllUsers()
    {

        return _userQueryMaster.GetAllUsers();
    }
}

DataAccesLayer.UserQueryMaster

public class UserQueryMaster : IUserQueryMaster
{
    private readonly CoreContext _CoreContext;

    public UserQueryMaster(CoreContext CoreContext)
    {
        _CoreContext = CoreContext;
    }

    public string GetAllUsers()
    {
        var res = _CoreContext.Users.ToList();
        var json = JsonConvert.SerializeObject(res, Formatting.Indented);
        return json;
    }
}

测试

public class UnitTest
{
    [Fact]
    public void GetAllUsers()
    {
        //Arrange
        string JsonResult = @"{"//user1, user2... json format 
                                }";

        var mockIUserManager = new Mock<IUserManager>();
        UserController GetUserController = new UserController(mockIUserManager.Object);


        //Act
        var result = GetUserController.GetUser();

        //Assert
        Assert.Equal(JsonResult, result);
    }

}

现在,当我调试单元测试时,执行无法进入(F11)类“UserManager”,导致“结果”评估为“空”。我怀疑这可能是因为我没有在测试中指定 UserManager 和 UserQueryMaster 都有自己需要的服务来访问我正在寻找的数据。

我的问题是,如何使用这种“嵌套依赖注入”创建单元测试?

标签: c#dependency-injection.net-coremoqxunit

解决方案


你在嘲笑IUserManager,这意味着所有的嵌套服务都不相关。

你唯一缺少的是设置你的模拟来返回你可以测试的东西。例如:

mockIUserManager.Setup(mum => mum.GetAllUsers()).Returns(JsonResult);

推荐阅读