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

时间:2016-07-08 17:10:27

标签: c# unit-testing

可能会走下兔子洞,但值得在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;
  }

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

1 个答案:

答案 0 :(得分:2)

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

如果

,请遵循一些规则
  1. 您希望您的代码可以测试
  2. 想要写出不错的单元测试
  3. 规则:永远不要在类中使用硬编码依赖项,始终使用抽象并始终使用DI来注入依赖项。当你需要嘲笑事物时,这就是帮助你的东西,当你需要改变时它也可以帮助你。

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

    您的单元测试不应该触及真实的系统,这意味着磁盘上的文件,外部API,数据库等。原因是您最终会进行大量的单元测试,并且您希望它们非常快,而不是20分钟完成。许多团队都有规则,例如他们从不接受代码提交,除非代码被单元测试覆盖并且所有现有的单元测试仍然通过。你想每次提交等待20分钟吗?

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

    你无法想象有多少次我看过没有断言的单元测试。

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