用 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;
}
每个人都有个人意见,但我正在寻找最佳实践。如何确定我们需要停止嘲笑的路线?
哇,这么大的话题...好吧,让我们:)介绍一些事情。
如果出现以下情况,需要遵循一些规则
- 您希望代码可测试
- 想写体面的单元测试
规则:永远不要在类中使用硬编码的依赖项,始终使用抽象并始终使用 DI 注入依赖项。当你需要模拟事情时,这就是帮助你的原因,当你需要改变事情时,它也可以帮助你。
单元测试:这里有一些基本规则,例如:
你的单元测试不应该接触真实的系统,即磁盘上的文件、外部 API、数据库等。原因是你最终会得到很多单元测试,你希望它们非常快,而不是需要 20 分钟才能完成。许多团队都有规则,例如他们从不接受代码提交,除非代码被单元测试涵盖并且所有现有的单元测试仍然通过。是否要每次提交时等待 20 分钟?
确保您的测试不共享状态,您的测试需要能够独立运行,而不是依赖于由以前的测试设置或更改的内容。
你无法想象我见过多少次不断言任何东西的单元测试。
当然还有很多,但如果你坚持这些基本原则,你应该没事。