c# - 如何正确模拟调用不同项目中实现依赖注入的方法的控制器?
问题描述
我有一个以这种方式构建的解决方案
>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 都有自己需要的服务来访问我正在寻找的数据。
我的问题是,如何使用这种“嵌套依赖注入”创建单元测试?
解决方案
你在嘲笑IUserManager
,这意味着所有的嵌套服务都不相关。
你唯一缺少的是设置你的模拟来返回你可以测试的东西。例如:
mockIUserManager.Setup(mum => mum.GetAllUsers()).Returns(JsonResult);
推荐阅读
- php - 无法在 Elasticsearch 中创建索引
- git - 如何使用 buildbot 构建每个标签?
- vuejs2 - Vue JS 组件监听孙子组件的事件
- javascript - 如何使用 react-spring 创建视差固定标题
- ios - iOS 中未声明类型 AudioDeviceID 的使用
- symfony - laravel 和 symfony 的比较
- grafana - 在grafan中将图表重置为0
- javascript - 对复杂数组进行分组
- javascript - 在 node.js 上使用 bcrypt 散列密码问题
- javascript - Instantsearch.js:使用来自 Algolia 的查询参数过滤初始搜索