尝试使用OCMock测试类方法时,我的行为确实无法预测。我遇到的问题是在尝试获取传递给类方法的参数值时。
当我在我的测试中调用mock上的方法时,一切都很完美:
- (void)test {
id mockArchiver = OCMClassMock([TestArchiver class]);
[[mockArchiver class] archiveRootObject:@[@"1", @"2", @"3"]];
OCMVerify([mockArchiver archiveRootObject:[self objectChecker]]);
}
- (OCMArg *)objectChecker {
return [OCMArg checkWithBlock:^BOOL(id value) {
// value is equal to correct array
return YES;
}];
}
但是当我在我正在测试的实际类中调用该方法时问题出现了:
- (void)test {
id mockArchiver = OCMClassMock([TestArchiver class]);
Archive *archive = [[Archive alloc] initWithArchiver: mockArchiver];
[archive useArchiver];
OCMVerify([mockArchiver archiveRootObject:[self objectChecker]]);
}
- (OCMArg *)objectChecker {
return [OCMArg checkWithBlock:^BOOL(id value) {
// value returns very sporadic data
return YES;
}];
}
useArchiver非常简单......
- (void)useArchiver {
[[self.archiver class] archiveRootObject:@[@"1", @"2", @"3"]];
}
值返回的值非常难以预测。有时它会返回正确的数组,但大部分时间都没有。它可能返回的一些例子:
value __NSCFString * @"archiveRootObject:" 0x00007f80725f34f0
value __NSCFString * @"2015-02-02 10:22:47.838" 0x00007fda585e40d0
value __NSArrayM * @"1 object" 0x00007faa2158aaa0:
[0] OCMBlockConstraint * 0x7fa420632340 0x00007fa420632340
value __NSArrayI * @"3 objects" 0x00007fed53da1c50: // correct returned array
[0] __NSCFConstantString * @"1" 0x000000010b78e920
[1] __NSCFConstantString * @"2" 0x000000010b78e940
[2] __NSCFConstantString * @"3" 0x000000010b78e960
或返回OCMArg块的行上的EXC_BAD_ACCESS
有趣的是,这个问题似乎只在传入数组时发生 - 任何其他对象(如字符串,字典或自定义对象)都能正常工作。