C# 单元测试原理

C# 单元测试原理,c#,unit-testing,C#,Unit Testing,大家好,我开始学习单元测试或TDD 我有一些C#方面的经验,所以我从follow link开始 按照样品,到目前为止还不错 但当我自己开始第一种方法时 我有一些问题 我写了一个名为“Log”的方法 它将创建一个带有时间戳的.txt文件 例如,在我调用Log(“somethingerror”)之后 它将创建一个文件201510210030.txt 内容是“[2015-10-21 00:30:47]一些事情出错” 如何测试它 我可以看一下日志文件吗 但每次我更改文件名时 也许我会在另一种情况下改变

大家好,我开始学习单元测试或TDD

我有一些C#方面的经验,所以我从follow link开始

按照样品,到目前为止还不错

但当我自己开始第一种方法时

我有一些问题

我写了一个名为“Log”的方法

它将创建一个带有时间戳的.txt文件

例如,在我调用Log(“somethingerror”)之后

它将创建一个文件201510210030.txt

内容是“[2015-10-21 00:30:47]一些事情出错”

如何测试它

我可以看一下日志文件吗

但每次我更改文件名时

也许我会在另一种情况下改变折叠位置

或者我可能会将日志更改为DB或某个记录器服务器(使用IoC)

如何测试它?连接到数据库或记录器服务器?读文件

如果方法失败(DB关闭或文件身份验证失败),则可能性太大

它实际上不够“单位”,所以。。。我如何测试这样的方法

或者只是一些我对单元测试不理解的概念

非常感谢

对于单元测试(与所有事情一样),您需要务实。以100%的代码覆盖率为目标总是很好的,但这往往是不现实的。当您开始在测试中引入实际的数据库或文件系统时,您已经离开了单元测试的领域,进入了集成测试。集成测试绝对没有错,但重要的是不要混淆两者

我的建议是确保您在自己的独立类中拥有所有日志逻辑,该类通过依赖项注入提供给您正在测试的类(您提到了IoC,所以我假设您很熟悉)。一旦您这样做了,您就可以将一个模拟的“记录器”传递到您的类中,该类根本不涉及文件系统。这将确保您正在测试的类将处理实现该“记录器”接口的任何内容

如果您希望对记录器本身进行单元测试,那么恐怕这不太可能。记录器与文件系统(或数据库)紧密耦合,因此无法对其进行真正的单元测试。您总是可以将所有的持久性逻辑提取到另一个类中并模拟它,但您只是将问题推了回去。在应用程序和基础架构之间总会遇到一堵墙,两者紧密耦合。重要的是保持处理该交互的类相对简单,并确保使用集成测试对其进行测试