C# 关于单元测试的基本断言

C# 关于单元测试的基本断言,c#,asp.net-mvc,unit-testing,nunit,C#,Asp.net Mvc,Unit Testing,Nunit,给定下面的函数-如果值“Value”已从用户中删除,我是否能够断言?或者该断言是UserService测试的一部分 另外,我可以从函数中测试哪些断言 public IHttpActionResult Post(string value) { var user = authorizationService.GetCurrentUser(); var isDeleted = userService.DeleteValue(value, user);

给定下面的函数-如果值“Value”已从用户中删除,我是否能够断言?或者该断言是UserService测试的一部分

另外,我可以从函数中测试哪些断言

    public IHttpActionResult Post(string value)
    {
        var user = authorizationService.GetCurrentUser();

        var isDeleted = userService.DeleteValue(value, user);
        if (!isDeleted)
        {
            return NotFound();
        }

        userService.DeleteProperty(value, user);

        var identityResult = userService.Update(user);
        if (identityResult.Succeeded)
        {
            return Ok();
        }

        return InternalServerError();
    }

是的,您可以对此进行测试:单元测试不必是每个sé的最小可能单元,但它也可能包含其中的另一个单元。通过为这两种场景编写测试,您实际上是在创建一个分层项目,在这个项目中,您对不同的层以及它们为您的链添加的价值进行了单独的测试

您可以在生产链中与VAT进行类比,其中每个测试将测试每个细分市场中的增值。关于这方面的更多信息

这可以转化为您的问题:是的,您可以(并且应该)测试此操作方法是否完成了它应该完成的任务

您可以执行的几个测试示例:

  • value
    null
  • 不是预期格式(数字、负值、特殊字符)
  • 找不到用户
  • 有效的
    值将显示
    Ok()
您需要做的是确保您不是针对生产数据库进行测试,而是在内存存储库中使用(模拟、伪造、存根、缝合,您可以随意选择)

通过在控制器和
userService
中进行这些测试,您将知道问题的确切位置,以防问题无法按您希望的方式工作:

测试:控制器维修结论
工作
有缺陷的测试不起作用
无法工作控制器测试失败
不工作不工作服务测试失败
虽然不为控制器编写测试,但依赖服务并不能提供代码实际工作的信息


单元测试和其他类型的测试(主要是集成和验收测试)是很薄的,因为您正在测试系统的更大的一部分,但我仍然认为它是单元测试,因为它包含在应用程序的逻辑中,并且不使用任何外部资源(数据库调用得到嘲笑/剪切/…)。.

是的,但是在这个函数的特殊情况下,我如何测试该值是否被删除?验证该值是否被删除确实是对
userService
的测试,而不是对
Post
方法的测试(如您所怀疑的)。这意味着您只需验证
Post
方法是否按预期调用了
userService
。这可以通过模拟
userService
并验证调用来实现,或者通过简单地断言
NotFound
不会返回(因为
NotFound
仅在未从用户中删除值时才会返回)。