【问题标题】:How to use OCMock to verify static methods如何使用 OCMock 验证静态方法
【发布时间】:2017-01-10 03:31:35
【问题描述】:

我正在尝试使用 OCMock 库。我正在尝试创建类对象的模拟,但无法验证该方法。我无法理解测试失败的原因。

@interface MyClass:NSObject
+(void) someMethod;
@end
@implementation MyClass
+(void) someMethod
{

    NSError* error = nil;
    if (![Utility isValidPropWithError:&error])
    {
        [Logger log:LoggerLevelWarning message:[error localizedDescription] className:className];
    }
}
@end

测试:

-(void)testIfLoggerIsset{
    id partialMockLogger = OCMClassMock([Logger class]);
    id partialMockUtility = OCMClassMock([Utility class]);
    id partialMockClass = OCMClassMock([MyClass class]);
    NSError *error = nil;
    OCMExpect([partialMockUtility isValidPropWithError:&error]);

    [MyClass someMethod];

    //This works fine.
    OCMVerifyAll(partialMockClass);
    NSString *className = @"classname";
    //This is failing...
    OCMVerify([partialMockUtility isValidPropWithError:&error]);
    OCMVerifyAll(partialMockUtility);
    //This is failing...
    OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);
    [partialMockUtility stopMocking];
    [partialMockLogger stopMocking];
}

在上面的代码中,虽然[Utility isValidPropWithError:&error];被称为OCMVerify([partialMockUtility isValidPropWithError:&error]);是失败的。

【问题讨论】:

    标签: objective-c unit-testing ocmock


    【解决方案1】:

    这里有几件事:

    首先,OCMVerify([partialMockUtility isValidPropWithError:&error] 失败了,因为您希望将您在测试中创建的NSError 对象的地址传递给isValidPropWithError:,但在MyClass +someMethod 中您正在创建不同 NSError 对象。两个不同对象的地址不会相同。

    要解决此问题,请将您的期望和验证更改为:

    OCMExpect([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg anyPointer]]);
    OCMVerify([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg 
    

    忽略参数的实际值并期望它是一个NSError 指针(因为您是在someMethod 内部创建它,所以在调用之前无法知道它会是什么方法)。

    其次,由于您已经明确验证了+isValidPropWithErrorOCMVerifyAll(partialMockUtility) 不会验证任何内容。您应该明确地验证您的所有期望,或者简单地使用OCMVerifyAll(partialMockUtility) 并让它验证您的所有期望并且不要为期待特定的电话而烦恼。 OCMVerifyAll 将验证你对你给它的模拟对象所期望的一切。这不会导致测试失败 - 两个调用都会通过,因为您已经第一次验证了调用,对 OCMVerifyAll() 的调用不会有任何需要验证的内容,所以它会通过。

    最后,OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]); 失败了,因为你没有为它设定期望。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多