2

介绍:

我有这个问题标题中提到的工具(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 的第 3 行时,我最终得到错误:

-[NSProxy doesNotRecognizeSelector:hasDeclaredPropertyWithName:] called!

问题:

为什么使用 OCMock 模拟类方法似乎是不可能的(至少在我的设置中)?

如果我hasDeclaredPropertyWithName采用像这样的实例方法

- (BOOL) hasDeclaredPropertyWithName: (NSString*) property;

一切正常!

有人可以向我解释这种 OCMock 缺陷吗?还是我在这里对 Objective-C 有一个重大的误解?:)

该类别是否可能导致运行时和/或 OCMock 头痛?顺便说一句,我没有TestObject直接用类方法尝试这个测试!

4

1 回答 1

2

好的,首先是基本情况,我们正在模拟一个类别类方法:

我为测试而准备的一些课程,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

类别的实现是否有可能没有编译到您的项目中?

于 2013-11-21T17:11:47.870 回答