简介:
我有这个问题标题中提到的工具(Xcode 5.0.2)、库(OCMock 2.2.1)和测试(XCTest)设置。
类别:
我在 NSObject 上有一个类别,其类方法如下:
+ (BOOL) hasDeclaredPropertyWithName: (NSString*) property;
OCMock 和 XCTest 框架有问题吗?:
现在我有一个简单的测试设置,我在其中模拟一个简单的值对象,如下所示: (我知道,模拟值对象是一种测试气味。但这仅用于说明目的。)
- (void) testFoo {
id mock = [OCMockObject mockForClass: [TestObject class]];
[[[mock stub] andReturn: NO] hasDeclaredPropertyWithName: @"propertyX"];
[mock hasDeclaredPropertyWithName: @"propertyX"];
}
当执行测试方法testFoo的第三行时,我最终得到错误:
-[NSProxy doesNotRecognizeSelector:hasDeclaredPropertyWithName:] called!
问题:
为什么使用 OCMock 模拟类方法似乎不可能(至少在我的设置中)?
如果我将 hasDeclaredPropertyWithName
设置为像
- (BOOL) hasDeclaredPropertyWithName: (NSString*) property;
一切正常!
有人可以向我解释一下 OCMock 的缺陷吗? 还是我对 Objective-C 存在重大误解? :)
该类别是否可能会给运行时和/或 OCMock 带来麻烦?
顺便说一句,我没有直接使用 TestObject
内的类方法尝试此测试!
最佳答案
好的,首先是基本情况,我们正在模拟类别类方法:
我有一些类(class)可供测试,Huzzah:
@interface Huzzah : NSObject
+ (void)doClass;
+ (void)doClass2;
+ (void)doClass3;
- (void)doInstance;
@end
我创建了一个类别:
@interface Huzzah (Cat)
+ (BOOL)hasX:(NSString *)x;
@end
@implementation Huzzah (Cat)
+ (BOOL)hasX:(NSString *)x
{
return YES;
}
@end
在我的测试中:
#import "Huzzah+Cat.h"
- (void)testHuzzahCat
{
id mock = [OCMockObject mockForClass:Huzzah.class];
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){NO})] hasX:OCMOCK_ANY];
NSLog(@"hasX: %i", [Huzzah hasX:@"DoYouHas?"]);
}
输出:hasX:0
现在让我们尝试一下 NSObject 上的类别:
@interface NSObject (Cat)
+ (BOOL)hasY:(NSString *)y;
@end
@implementation NSObject (Cat)
+ (BOOL)hasY:(NSString *)y
{
return YES;
}
@end
我们的新测试:
#import "NSObject+Cat.h"
- (void)testObjectCat
{
id mock = [OCMockObject mockForClass:Huzzah.class];
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){NO})] hasY:OCMOCK_ANY];
NSLog(@"hasY: %i", [Huzzah hasY:@"DoYouHas?"]);
}
结果:hasY: 0
类别的实现是否有可能没有被编译到您的项目中?
关于objective-c - OCMock 2.2.1、Xcode 5.0.2、XCTest 和模拟类方法(在类别中声明)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20095857/