为什么我不能使用OCMock将这个GKTurnBasedParticipant方法存根?

时间:2013-06-11 19:55:05

标签: ios unit-testing gamekit ocmock

这是一个OCUnit测试,只是简单地存储playerID的方法GKTurnBasedParticipant

#import <GameKit/GameKit.h>
#import "OnlineMatchTest.h"
#import "OCMock.h"

@implementation OnlineMatchTest

- (void)setUp {
    GKTurnBasedParticipant *participant = [OCMockObject mockForClass:[GKTurnBasedParticipant class]];
    [[[(id)participant stub] andReturn:@"123"] playerID];
}

- (void)test {
    // Do nothing.
}

@end

但是,测试失败,好像方法-[GKTurnBasedParticipant playerID]不存在一样:

Test Case '-[OnlineMatchTest test]' started.
Unknown.m:0: error: -[OnlineMatchTest test] : *** -[NSProxy doesNotRecognizeSelector:playerID] called!
Test Case '-[OnlineMatchTest test]' failed (0.000 seconds).

为什么会这样?我正在编译iOS 6.1 SDK,所以这种方法肯定存在。

1 个答案:

答案 0 :(得分:2)

我无法准确确定发生了什么,但是类的Apple's documentation表示你从未实例化它可能暗示它不会像你期望的那样表现。

一种解决方法是创建自己的对象类型,以满足您感兴趣的方法:

@interface FakeParticipant : NSObject
@property (nonatomic) id participantID;
@end

@implementation FakeParticipant
@end

...

- (void)testGameKit
{    
    id participant = [OCMockObject mockForClass:[FakeParticipant class]];
    [[[participant expect] andReturn:@"player1" ] participantID];  
}

由于我认为您的测试比此测试更复杂,您可能需要更改测试中的代码以允许您(部分)模拟请求参与者对象的位置。