对一个不返回任何东西的方法进行单元测试的最佳方法是什么?特别是在c#中。

我真正想测试的是一个方法,它接受一个日志文件并解析它的特定字符串。然后将字符串插入到数据库中。没有什么是以前没有做过的,但对于TDD来说是非常新的,我想知道是否有可能测试这个,或者它是没有真正测试过的东西。


当前回答

这取决于它在做什么。如果它有参数,则传入模拟,以便稍后询问是否使用正确的参数集调用了它们。

其他回答

它会对一个对象产生一些影响....查询效果的结果。如果没有明显的效果,就不值得进行单元测试!

这取决于它在做什么。如果它有参数,则传入模拟,以便稍后询问是否使用正确的参数集调用了它们。

一如既往:测试该方法应该做什么!

它是否应该在某个地方改变全局状态(哎呀,代码味道!)?

它是否应该调用接口?

当使用错误的参数调用时,它是否会抛出异常?

当使用正确的参数调用时,它是否不抛出异常?

应该……吗?

假设方法做了一些事情,而不是简单地返回?

假设是这样,那么:

If it modifies the state of it's owner object, then you should test that the state changed correctly. If it takes in some object as a parameter and modifies that object, then your should test the object is correctly modified. If it throws exceptions is certain cases, test that those exceptions are correctly thrown. If its behaviour varies based on the state of its own object, or some other object, preset the state and test the method has the correct Ithrough one of the three test methods above).

如果你告诉我们这个方法是做什么的,我可以更具体地说。

如果一个方法没有返回任何东西,它是下列情况之一

imperative -你要么要求对象对自己做一些事情。例如改变状态(不期待任何确认..这是假定会完成的) 信息-只是通知某人某事发生了(不期待行动或回应)。

命令式方法—您可以验证任务是否实际执行。验证状态是否发生了变化。如。

void DeductFromBalance( dAmount ) 

可以通过验证此消息的余额是否确实小于dAmount的初始值来测试

信息方法——很少作为对象的公共接口的成员。因此通常不是单元测试的。但是,如果必须,您可以验证是否对通知进行了处理。如。

void OnAccountDebit( dAmount )  // emails account holder with info

是否可以通过验证电子邮件是否正在发送来测试

发布更多关于你实际方法的细节,人们就能更好地回答问题。 更新:你的方法是做两件事。我实际上把它分成了两个方法,现在可以独立测试了。

string[] ExamineLogFileForX( string sFileName );
void InsertStringsIntoDatabase( string[] );

String[]可以通过向第一个方法提供一个虚拟文件和期望的字符串轻松验证。第二个问题有点棘手。您可以使用Mock(谷歌或在Mock框架上搜索stackoverflow)来模拟DB或击中实际的DB并验证字符串是否插入到正确的位置。检查这个线程的一些好书…如果你手头紧,我建议你使用实用单元测试。 在代码中,它的用法是

InsertStringsIntoDatabase( ExamineLogFileForX( "c:\OMG.log" ) );