【问题标题】:OCMock stub class methods of the class that is being tested正在测试的类的 OCMock 存根类方法
【发布时间】: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 -- 不确定这是否是问题...

标签: ocunit ocmock


【解决方案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”应该只针对项目(我不知道为什么,也许有人可以解释一下)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多