对一个不返回任何东西的方法进行单元测试的最佳方法是什么?特别是在c#中。
我真正想测试的是一个方法,它接受一个日志文件并解析它的特定字符串。然后将字符串插入到数据库中。没有什么是以前没有做过的,但对于TDD来说是非常新的,我想知道是否有可能测试这个,或者它是没有真正测试过的东西。
对一个不返回任何东西的方法进行单元测试的最佳方法是什么?特别是在c#中。
我真正想测试的是一个方法,它接受一个日志文件并解析它的特定字符串。然后将字符串插入到数据库中。没有什么是以前没有做过的,但对于TDD来说是非常新的,我想知道是否有可能测试这个,或者它是没有真正测试过的东西。
当前回答
如果一个方法没有返回任何东西,它是下列情况之一
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" ) );
其他回答
这取决于它在做什么。如果它有参数,则传入模拟,以便稍后询问是否使用正确的参数集调用了它们。
如果一个方法没有返回任何东西,它是下列情况之一
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" ) );
它会对一个对象产生一些影响....查询效果的结果。如果没有明显的效果,就不值得进行单元测试!
试试这个:
[TestMethod]
public void TestSomething()
{
try
{
YourMethodCall();
Assert.IsTrue(true);
}
catch {
Assert.IsTrue(false);
}
}
无论你使用什么实例来调用void方法,你可以使用,验证
例如:
在我的例子中,它的_Log是实例,LogMessage是要测试的方法:
try
{
this._log.Verify(x => x.LogMessage(Logger.WillisLogLevel.Info, Logger.WillisLogger.Usage, "Created the Student with name as"), "Failure");
}
Catch
{
Assert.IsFalse(ex is Moq.MockException);
}
验证是否由于测试将失败的方法失败而抛出异常?