2

这是一个 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 进行编译,所以这种方法肯定存在。

4

1 回答 1

2

我无法确切确定会发生什么,但Apple 的类文档说你从不实例化它可能暗示它不会像你预期的那样运行。

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

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

@implementation FakeParticipant
@end

...

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

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

于 2013-06-12T21:13:07.223 回答