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

basic assertions about unit testing

鉴于以下功能 - 如果从用户中删除了值"值",我是否可以断言? 或者,断言是UserService测试的一部分吗?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    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é可能的最小单位,但它也可能包含其中的另一个单位。通过为这两种方案编写测试,您实际上是在创建一个分层项目,在该项目中,您可以对不同的层以及它们添加到链中的值进行单独的测试。

您可以在生产链中使用增值税进行类比,其中每个测试将测试每个细分中的增值。有关这方面的更多信息。

这会将您的问题转换为:是的,您可以(并且应该)测试此操作方法是否执行了它应该执行的操作。

您可以做的一些测试示例:

  • valuenull
  • value不是期望格式(数字,负值,特殊字符)
  • 找不到用户
  • 有效的value将显示Ok()

您需要做的是确保您没有针对生产数据库进行测试,而是使用内存存储库(模拟,伪造,存根,接缝,您将其命名)。

通过在控制器和userService内部进行这些测试,您将知道问题的确切位置,以防它无法正常工作:

1
2
3
4
5
Test for:   Controller           Service              Conclusion
            Works                Works                Works
            Works                Doesn't work         Faulty tests
            Doesn'
t work         Works                Controller test failed
            Doesn't work         Doesn't work         Service test failed

虽然没有为控制器编写测试但是依赖于服务不会为您提供代码实际工作的信息。

单元测试和其他类型(主要是集成和验收测试)之间的界限很薄,因为您正在测试系统的更大部分,但我仍然认为它是单元测试,因为它包含在应用程序的逻辑中而不是使用任何外部资源(数据库调用得到模拟/存根/ ...)。