正在测试的类的OCMock存根类方法

时间:2013-09-06 14:57:43

标签: ocunit ocmock

+(NSString *) classMethod:(id)someDataObject
{
    NSString *returnStr;

    //do something with someDataObject and set returnStr
    //...    

    returnStr = [NSString stringWithFormat:@"%@%@", returnStr,[self getCurrentTimestamp]];

    return returnStr;
}

+ (NSString *)getCurrentTimestamp
{
    NSNumber *t = [NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970]];
    return [t stringValue];
}

我正在努力为classMethod编写测试用例,因为当我运行OCUnit测试并将OCMock对象传递给classMethod时,输出将始终不同,因为我添加时间戳。 stub 类方法的最佳方法是什么 - getCurrentTimestamp?实际上是否可以存储正在测试的类的类方法?

我试过这样,但它不起作用:

 id mock =  [OCMockObject mockForClass:[MyClass class]];
 [[[mock stub] andReturn:@1378468455] getCurrentTimestamp];

 NSString *str = [MyClass classMethod:someMockObject];

2 个答案:

答案 0 :(得分:1)

这对我来说很好用:

+(NSString *) classMethod:(id)someDataObject
{
    NSString *returnStr = @"prefix-";
    returnStr = [NSString stringWithFormat:@"%@%@", returnStr,[self getCurrentTimestamp]];
    return returnStr;
}

+ (NSString *)getCurrentTimestamp
{
    NSNumber *t = [NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970]];
    return [t stringValue];
}

- (void)testClass
{
    id mock =  [OCMockObject mockForClass:[Bar class]];
    [[[mock stub] andReturn:@"1378468455"] getCurrentTimestamp];   
    NSString *str = [Bar classMethod:nil];
    NSLog(@"Str: %@", str);
}

// Result: 
// Str: prefix-1378468455

您能否确认您的OCMock版本,将数字更改为字符串,和/或解释它是如何不适合您的?

答案 1 :(得分:0)

谢谢@BenFlynn。你的例子(以及我的)确实在起作用。问题是“MyClass.h”也在目标成员资格中检查了联合测试。 “MyClass.h”应该只针对项目(我不知道为什么,也许有人可以解释它)。