c# - 如何在 C# 中对 Task.run() 进行单元测试?
问题描述
这个问题以前被问过,但没有回答。我想测试身份验证方法,我们正在检查来自数据库的授权用户,如果不是 Null,将返回用户的详细信息。我怎样才能对此进行单元测试?我正在使用 Xunit。
public async Task<User> Authenticate(string username, string password)
{
var user = await Task.Run(() => _users.SingleOrDefault(x => x.Username == username
&& x.Password == password));
// return null if user not found
if (user == null)
{
return null;
}
return new User
{
Id = user.Id,
FirstName = user.FirstName,
LastName = user.LastName,
Username = user.Username,
Password = ""
};
}
_user 是一个列表。
解决方案
Task.Run 只是一个细节;通过代码块,测试用例可能是:
- SingleOrDefault 返回 null
- SingleOrDefault 返回单个用户
没有异常处理,但这可能是您可能想要做的另一个测试。
如果您想在调用 SingleOrDefault 以调整您在那里的等待时引入延迟,您可能必须考虑模拟 _users 以便您可以引入该行为。我认为您不一定需要,但 Task.Run 仍将执行委托并提供结果,无论是否延迟。如果您确实想坚持使用它,SingleOrDefault 将是一个扩展,因此您最终会模拟底层 LINQ 提供程序来执行此操作,任何流行的模拟框架都可以作为返回值回调的一部分来执行此操作。
最后,您的 xUnit 测试方法可能需要修饰以处理异步 SUT。
StackOverflow 不是代码编写服务;到目前为止,您尝试了什么,您到底遇到了什么问题等等。考虑到上述几点,应该足以搜索和提出更具体的问题。
推荐阅读
- reactjs - 在路由到另一个页面时的反应路由器中,它从我离开上一页的部分开始?
- html - JQuery位置给出绝对坐标而不是相对坐标
- spring-boot - 使用 webpack devserver 时访问 Thymeleaf Spring Boot application.properties
- c# - OData V4 中的 $expand
- optimization - CPLEX:错误 5002 目标不是凸的 -> 问题可以通过最优目标 3 解决到全局最优 ->
- reactjs - @material-ui 自动完成:以编程方式设置输入值
- r - 使用字符串列表R替换所有列值的有效方法
- kubernetes - 减少kubernetes operator的权限
- python - 没有颜色混合的 Matplotlib 散点图
- mysql - AWS RDS 运行 MySQL 5.7,CPU 利用率很高,运行的进程很少