首页 > 解决方案 > 如何在 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 是一个列表。

标签: c#unit-testingmoqxunit

解决方案


Task.Run 只是一个细节;通过代码块,测试用例可能是:

  • SingleOrDefault 返回 null
  • SingleOrDefault 返回单个用户

没有异常处理,但这可能是您可能想要做的另一个测试。

如果您想在调用 SingleOrDefault 以调整您在那里的等待时引入延迟,您可能必须考虑模拟 _users 以便您可以引入该行为。我认为您不一定需要,但 Task.Run 仍将执行委托并提供结果,无论是否延迟。如果您确实想坚持使用它,SingleOrDefault 将是一个扩展,因此您最终会模拟底层 LINQ 提供程序来执行此操作,任何流行的模拟框架都可以作为返回值回调的一部分来执行此操作。

最后,您的 xUnit 测试方法可能需要修饰以处理异步 SUT。

StackOverflow 不是代码编写服务;到目前为止,您尝试了什么,您到底遇到了什么问题等等。考虑到上述几点,应该足以搜索和提出更具体的问题。


推荐阅读