用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。

Posted

技术标签:

【中文标题】用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。【英文标题】:OCUnit or OCmock testing methodology for locally instantiated and scoped variables. 【发布时间】:2012-06-28 23:27:10 【问题描述】:

我是 OCUnit 和 OCMock 的新手,想了解有关此测试方法的更多信息。

我知道 OCUnit 和 OCMock 创建存根生成模拟对象等的能力...

我有一个特定的用例,但我还不能破解。

-(bool) isGameCenterAvailable

    // Check for presence of GKLocalPlayer API.
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

    // The device must be running running ios 4.1 or later.
    bool isIPAD = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
    NSString *reqSysVer = (isIPAD) ? @"4.2" : @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

return (gcClass && osVersionSupported);

这是我对单元测试的问题:

1) NSClassFromString(@"GKLocalPlayer") 是对foundation.h 的调用,据我所知,它无法存根。

2) [[UIDevice currentDevice] systemVersion] 是函数作用域的本地调用。我的方法调用另一个类(UIDevice)中的方法我想用存根覆盖他们的函数调用,以返回一个固定的答案来练习这个函数的每个路径。

如果类在被测函数的范围内实例化,则不确定是否可以模拟类。

此外,如何测试 #1 之类的类方法。

重构是这里唯一的答案吗?

【问题讨论】:

【参考方案1】:

对于#1,您可以创建一个检查GKLocalPlayer API 的方法:

-(BOOL)isGKLocalPlayerSupported 
    return (NSClassFromString(@"GKLocalPlayer")) != nil;

然后您可以模拟该方法。如果您在被测类中创建方法,则可以使用部分模拟:

-(void)testIsGameCenterAvailable 
    // create gameCenterChecker instance to test...

    id mockChecker = [OCMockObject partialMockForObject:gameCenterChecker];
    BOOL supported = YES;
    [[[mockChecker stub] andReturnValue:OCMOCK_VALUE(supported)] isGKLocalPlayerSupported];

    expect([gameCenterChecker isGKLocalPlayerSupported]).toBeTruthy();

根据您的项目,将其放在实用程序类中可能更有意义,在这种情况下您将模拟实用程序:

-(void)testIsGameCenterAvailable 
    id mockUtility = [OCMockObject mockForClass:[MyUtility class]];
    [MyUtility setSharedInstance:mockUtility];
    BOOL supported = YES;
    [[[mockUtility stub] andReturnValue:OCMOCK_VALUE(supported)] isGKLocalPlayerSupported];

    // create gameCenterChecker instance to test...

    expect([gameCenterChecker isGKLocalPlayerSupported]).toBeTruthy();

您可以对系统版本和设备采取相同的方法:

-(NSString *)systemVersion;
-(BOOL)isIpad;

【讨论】:

以上是关于用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。的主要内容,如果未能解决你的问题,请参考以下文章

Bean总结

Bean总结

Mysql变量一览

JS作用域

JS块级作用域和私有变量实例分析

vuejs methods中的方法互相调用时变量的作用域是