这是一个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,所以这种方法肯定存在。
答案 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];
}
由于我认为您的测试比此测试更复杂,您可能需要更改测试中的代码以允许您(部分)模拟请求参与者对象的位置。