正在测试的类的 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 存根类方法的主要内容,如果未能解决你的问题,请参考以下文章