可能会走下兔子洞,但值得在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;
}
每个人都有个人意见,但我正在寻找最佳实践。如何确定我们需要停止嘲笑的界限?
答案 0 :(得分:2)
如果
,请遵循一些规则规则:永远不要在类中使用硬编码依赖项,始终使用抽象并始终使用DI来注入依赖项。当你需要嘲笑事物时,这就是帮助你的东西,当你需要改变时它也可以帮助你。
单元测试:这里有一些基本规则,例如:
您的单元测试不应该触及真实的系统,这意味着磁盘上的文件,外部API,数据库等。原因是您最终会进行大量的单元测试,并且您希望它们非常快,而不是20分钟完成。许多团队都有规则,例如他们从不接受代码提交,除非代码被单元测试覆盖并且所有现有的单元测试仍然通过。你想每次提交等待20分钟吗?
确保您的测试不共享状态,您的测试需要能够独立运行,而不是依赖于之前测试设置或更改的内容。
你无法想象有多少次我看过没有断言的单元测试。
当然还有很多,但如果你坚持这些基本原则,你应该没事。