objective-c - OCMock 2.2.1、Xcode 5.0.2、XCTest 和模拟类方法(在类别中声明)的问题

标签 objective-c unit-testing xcode5 ocmock xctest

简介:

我有这个问题标题中提到的工具(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/

相关文章:

objective-c - NSOutlineView:为什么 shouldEditTableColumn: 被调用两次?

iphone - 单元测试 xcode 4

asp.net-mvc - 如何在 MSTest 中对 JsonResult 和集合进行单元测试

xcode - 在 Xcode 终端中运行时找不到“Cordova/CDVViewController.h”文件

ios - resignFirstResponder 不隐藏键盘

ios - 如何在 Swift 中使用 Github Mantle 的 MTLValueTransformer?

ios - UITextview 的 textFieldShouldReturn 方法

macos - NSWindowController 上的 viewWillAppear 或 viewDidAppear

iphone - 如何解决运行时错误NSString,sqlite3_column_text NULL问题?

java - JUnit 终止子线程