用 C# 编写单元测试的正确方法

本文关键字:方法 单元测试 | 更新日期: 2023-09-27 17:56:00

可能正在进入兔子洞,但值得在StackOverflow上询问并从专家那里获得意见。

编写单元测试的正确方法是什么?具体来说,如果我们有一个单元测试函数,它反过来调用来自同一项目的一个或多个其他函数......其他两个函数调用应该被嘲笑吗?

例:

单元测试:

[Test]
  public void ReadZipFileContainer_Test()
  {
     AClass aObject = new AClass();
     string fileToRead = System.IO.Path.Combine(Directory.GetCurrentDirectory(), @"..'..'TestData'TestFile.zip");
     List<string> entityIds = new List<string>() { UtilsClass.kItemId };
     Dictionary<string, string> filesData1 = AClass.ReadFileContainer(fileToRead, entityIds);
     Assert.AreEqual(filesData1.Count, 1);
  }

在AClass中:

  public Dictionary<string, string> ReadZipFileContainer(string fileToRead, List<string> itemIds)
  {         
     Dictionary<string, string> fileContent = new Dictionary<string, string>();         
     try
     {
        Dictionary<string, string> entities = CClass.OpenContainer(fileToRead); // => call to another function. Should this call be mocked?
        //Process         
     }         
     catch (Exception ex)
     {
        // We return empty directory after closing the container
        logger.LogException(ex);
        throw;
     }
     finally
     {
        CClass.CloseContainer();
     }         
     return fileContent;
  }

每个人都有个人意见,但我正在寻找最佳实践。如何确定我们需要停止嘲笑的路线?

用 C# 编写单元测试的正确方法

哇,这么大的话题...好吧,让我们:)介绍一些事情。

如果出现以下情况,需要遵循一些规则

  1. 您希望代码可测试
  2. 想写体面的单元测试

规则:永远不要在类中使用硬编码的依赖项,始终使用抽象并始终使用 DI 注入依赖项。当你需要模拟事情时,这就是帮助你的原因,当你需要改变事情时,它也可以帮助你。

单元测试:这里有一些基本规则,例如:

你的单元测试不应该接触真实的系统,即磁盘上的文件、外部 API、数据库等。原因是你最终会得到很多单元测试,你希望它们非常快,而不是需要 20 分钟才能完成。许多团队都有规则,例如他们从不接受代码提交,除非代码被单元测试涵盖并且所有现有的单元测试仍然通过。是否要每次提交时等待 20 分钟?

确保您的测试不共享状态,您的测试需要能够独立运行,而不是依赖于由以前的测试设置或更改的内容。

你无法想象我见过多少次不断言任何东西的单元测试。

当然还有很多,但如果你坚持这些基本原则,你应该没事。