我是单元测试的新手,并且想知道如何对单元测试程序进行单元测试(在这种情况下,程序是一个“做某事”而不是“返回某些东西”的函数。
我知道测试返回答案的函数的一般想法就像
assert(yourfunction(sample, inputs) == expected_answer);
但我想知道如果某些东西没有返回或仅返回状态代码,这将如何工作。
答案 0 :(得分:2)
您需要能够测试它的作用。例如,您的过程是否向集合添加了一些内容?设置房产?创建文件?
无论是什么,大概是某种变化以某种方式。你只需要弄清楚如何检查这种效果。当然,有时说起来容易做起来容易,这就是为什么功能方法在适合时更容易测试的原因:)特别是修改外部资源(文件系统,数据库等)和依赖的效果的效果外部资源(同上)比那些只以相当“本地”方式改变事物的那些更难测试。
答案 1 :(得分:1)
在某些情况下,过程的作用是调用其他依赖项的方法。在这种情况下,如果您使用依赖注入方法,则可以传入这些依赖项的模拟,并使用断言或期望来确保使用正确的参数在依赖项上调用正确的方法。
答案 2 :(得分:1)
对于程序,“做某事”通常涉及API调用或其他对象操作。
例如,过程可能会将一行写入文件。它使用文件I / O API调用(或文件IO对象)来“写一行”。
您要做的是创建“模拟”对象以代替文件。 Mock对象具有足够的功能来收集测试结果并使它们对断言可见。不要覆盖你的模拟对象,这是一个失去时间的老鼠洞。
在Python中,我们会做这样的事情。
class MockFile( object ):
def __init__( self, aFileName, aMode ):
self.name= aFileName
self.mode= aMode
self.buffer= None
def write( self, aRow ):
self.buffer= str(aRow)
现在我们可以将这个模拟文件提供给我们的程序而不是真正的文件。我们可以对发生的事情做出断言。
class TestSomeProcedure( unittest.TestCase ):
def testWrite( self ):
mockFile= MockFile( "name", "w" )
theProcedureImTesting( args, args, args, mockFile )
self.assertEquals( "The Row It Was Supposed to Write\n", mockFile.buffer )
答案 3 :(得分:0)
有许多不同的情况:
案例1:
public class A
{
public void Foo()
{
Init();
}
protected virtual void Init()
{
Do something;
}
}
[TestFixture]
public class ATests
{
[Test]
public void Foo_test()
{
A aStub = new A_Stub();
aStub.Foo();
Assert.IsTrue(aStub.wasInit);
}
public class A_Stub : A
{
public bool wasInit;
protected override void Init()
{
wasInit = true;
}
}
}
案例2: 当您的方法依赖于另一个对象而不是执行属于同一个类的成员时。在这种情况下,我建议使用Mock框架。我个人使用Rhino.Mocks。您可以点击此链接查看Rhino.Mocks examples。