在 Symbian S60 平台进行单元测试
2010-03-16 17:18:00 来源:WEB开发网void RSendAsMessage::CreateL(RSendAs &, TUid) {}
TInt CMsvStore::HasBodyTextL(void) const { return KErrNone; }
CMsvStore * CMsvEntry::ReadStoreL(void) { return NULL; }
当所有缺失的方式都被使用之后,目标工程编译并链接。此时测试工程将正常无误运行。
● 实现测试
现在我们开始在实际条件下测试目标。任何有测试前缀的方式可看作是一个由框架执行的测试实例。测试实例被执行之后,该测试框架在调用测试法和tearDown()之前调用setUp() 函数。安装时应把测试目标设置成默认状态。测试实例中,只需要在已经实例化的测试目标中运行该方式以证实使用的方式和状态是我们预期的。测试目标和设置时生成的其它源代码需被销毁。我们可按以下方式设置:
void CMapExampleSmsEngineTest::setUp()
{
iObserver = new (ELeave) DummyObserver();
iTarget = CMapExampleSmsEngine::NewL(iObserver);
}
在构造过程中驱动器需要一个观察器。对参数可使用伪排除(查看附录A的详细介绍)。释放资源时执行销毁。
void CMapExampleSmsEngineTest::tearDown()
{
delete iTarget;
delete iObserver;
}
首先应拿来测试的实例是短信发送。这是个很简单的过程:该函数被调用而且如果他没有退出(抛出异常)那么这个测试用例就通过了。
void CMapExampleSmsEngineTest::testSendMessage()
{
iTarget->SendSmsL(_L("12345678"), _L("abcd"));
}
短信发送可能会失败。RSendAsMessage::SetBodyTextL()可被退出以模拟异常。然后执行测试实例来确保SendSmsL退出。尽管如此,仅在测试实例里SetBodyTextL才能退出而且测试实例应控制该过程。实现控制的一种方法是运用全局变量,在调用测试目标时设置该测试实例,然后在变量的基础上实现SetBodyTextL。另一种更普遍的方法是定义一个全局函数指针,该指针在定义时被SetBodyTextL调用。测试实例代码如下:
1 // global function pointer
2 void (*gRSendAsMessage_SetBodyTextLHook)() = NULL;
3
4 void ThrowExceptionL()
5 {
6 User::Leave(KErrGeneral);
更多精彩
赞助商链接