如何正确模拟在实现依赖注入的不同项目中调用方法的控制器?
How to properly mock a controller that calls methods in different projects that implement dependency injection?
我有一个这样构建的解决方案
>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();
}
}
BusinessLogic.UserManager
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) class 'UserManager',导致 'result' 评估为 'null'。我怀疑这可能是因为我没有在测试中的任何地方指定 UserManager 和 UserQueryMaster 都有自己需要的服务来访问我正在寻找的数据。
我的问题是,如何使用此 'nested dependency injection' 创建我的单元测试?
您在嘲笑 IUserManager
,这意味着所有嵌套服务都不相关。
您唯一缺少的是将模拟设置为 return 您可以测试的内容。例如:
mockIUserManager.Setup(mum => mum.GetAllUsers()).Returns(JsonResult);
我有一个这样构建的解决方案
>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();
}
}
BusinessLogic.UserManager
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) class 'UserManager',导致 'result' 评估为 'null'。我怀疑这可能是因为我没有在测试中的任何地方指定 UserManager 和 UserQueryMaster 都有自己需要的服务来访问我正在寻找的数据。
我的问题是,如何使用此 'nested dependency injection' 创建我的单元测试?
您在嘲笑 IUserManager
,这意味着所有嵌套服务都不相关。
您唯一缺少的是将模拟设置为 return 您可以测试的内容。例如:
mockIUserManager.Setup(mum => mum.GetAllUsers()).Returns(JsonResult);