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

Posted

技术标签:

【中文标题】正在测试的类的 OCMock 存根类方法【英文标题】:OCMock stub class methods of the class that is being tested 【发布时间】:2013-09-06 14:57:43 【问题描述】:
+(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];

【问题讨论】:

我注意到您的存根返回的是 NSNumber 而不是 NSString -- 不确定这是否是问题... 【参考方案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 版本,将数字更改为字符串,和/或解释它如何不适合您?

【讨论】:

嘿@Ben Flynn 你看起来是个好人.. 看看this 非常相似的问题【参考方案2】:

谢谢@BenFlynn。您的示例(以及我的示例)确实有效。问题是“MyClass.h”也已在 Target Membership 中进行了联合测试。 “MyClass.h”应该只针对项目(我不知道为什么,也许有人可以解释一下)。

【讨论】:

以上是关于正在测试的类的 OCMock 存根类方法的主要内容,如果未能解决你的问题,请参考以下文章

在 OCMPartialMock 上存根类方法?

所有调用的 OCMock 存根类方法

扩展特征的单元测试类 - 我如何在特征中模拟和存根方法?

OCMock:存根 @dynamic 属性

OCMock 中的存根类方法

不能在 Xcode 5.0 中使用 OCMock 2.1+ 存根类方法