6

我让 Visual Studio 为班上的每个成员创建了一个测试。这是一个例子:

/// <summary>
///A test for CloseCurrentTextLogFile
///</summary>
[TestMethod()]
public void CloseCurrentTextLogFileTest()
{
  Logger.CloseCurrentTextLogFile();
  Assert.Inconclusive( "A method that does not return a value cannot be verified." );
}

基于断言字符串,我想知道如何测试这个......有什么想法吗?

4

5 回答 5

3

静态方法自然会使自己相当难以测试,所以我的建议是基于将代码从静态方法中重构出来。

我会把 Logger 变成一个实例类,它在构造函数中接受一个 IO 对象。这将允许您存根 IO 对象,并且您可以断言您的 IO 对象的Close方法已被调用。

仅当您想让您的代码 100% 可测试时。否则,我会同意 Mo 的观点,即如果它不可测试,则不要编写强制测试……那些往往非常脆弱。最后,你需要对你的代码务实。通常,记录器对于保持静态很有用,但是正如我已经提到的,这些往往是非常不可测试的......所以对你的工作要务实,不要仅仅为了获得 100% 的代码覆盖率而编写测试...... .that 100% will come with a price...

更新

这就是为什么这不能从单元测试的教条 POV 中真正测试的原因。您不是在测试一个工作单元,而是在测试 LoggerLogger 的依赖项(在本例中为 IO 对象)。它还使您的测试变慢并且需要环境设置和状态(您必须先打开一个实际文件才能关闭它,对吗?)。这些对于单元测试都是不利的,但对于集成测试来说还可以……所以这也取决于你正在编写什么样的测试。

于 2012-07-06T17:04:53.913 回答
3

我会假设,如果它真的不可测试,那么它实际上根本不会做任何事情,也不应该存在;)类似这样的东西可能会起作用......

Assert.IsNotNull( Logger.File );
Logger.CloseCurrentTextLogFile();
Assert.IsNull( Logger.File );

或检查状态Logger.FileOpenStatus或检查是否Logger.OpenFile(fname)在关闭之前引发异常,但不是在之后。一定有某种东西Logger的行为取决于所CloseCurrentTextLogFile()执行的任何行动。

于 2012-07-06T17:00:02.917 回答
2

您可以检查Loggerlogger 的状态,也可以调用其他不会产生错误的方法,因为您调用了此方法,如果您没有调用该方法,则应该会成功。

于 2012-07-06T16:53:54.600 回答
2

我也不确定,但您可以尝试以下操作: 函数应该做某事(写入文件、设置一些变量等) 也许您可以检查变量是否已写入,或者文件是否已创建。

于 2012-07-06T16:54:05.120 回答
1

您可以模拟Logger该类并断言CloseCurrentTextLogFile正在调用该类。有些人可能会争辩说您需要检查所有打开的日志文件是否已关闭,我个人不同意这一点,因为这会测试Logger本身而不是您的方法。这是开发人员在开始设计系统时应该问自己的问题,我如何测试我的应用程序。

于 2012-07-06T16:57:21.560 回答