我正在尝试使用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]);
失败。
答案 0 :(得分:0)
这里有几件事:
首先,OCMVerify([partialMockUtility isValidPropWithError:&error]
失败了,因为您希望将您在测试中创建的NSError
对象的地址传递给isValidPropWithError:
,但是MyClass +someMethod
您正在创建不同的 NSError
对象。两个不同对象的地址不一样。
要解决此问题,请将您的期望和验证更改为:
OCMExpect([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg anyPointer]]);
OCMVerify([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg
并且忽略参数的实际值并期望它将成为NSError
指针(因为您在someMethod
内创建它,那里&#39在你打电话给方法之前,无法知道它会发生什么。)
其次,由于您已明确验证+isValidPropWithError
,OCMVerifyAll(partialMockUtility)
无法验证任何内容。您应该明确验证您的所有期望,或者只是使用OCMVerifyAll(partialMockUtility)
并让它验证您的所有期望,而不必为期望特定的电话而烦恼。 OCMVerifyAll
将验证您对其提供的模拟对象所期望的一切。这不会导致测试失败 - 两次通话都会通过,因为您已经第一次验证了通话,对OCMVerifyAll()
的通话不会有任何问题验证,所以它会通过。
最后,OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);
失败了,因为你没有为它设定期望。