在OCMock docs中,您可以轻松地模拟一个类或协议:
id classMock = OCMStrictClassMock([SomeClass class]);
id protocolMock = OCMStrictProtocolMock(@protocol(SomeProtocol));
我的问题是:你能两个吗?基本上我想模拟一个也实现这个协议的MPMediaItem:
@protocol VBLoggableProtocol <NSObject>
/*
* Returns a string that gives a detailed description of the properites of this object
*/
- (NSString *)propertiesStr;
/*
* Returns a string that simply identifies the object (ie song.title)
*/
- (NSString *)idStr;
@end
但我不知道如何......想法?
答案 0 :(得分:3)
OCMock目前无法做到这一点。有一个模拟多个协议(https://github.com/erikdoe/ocmock/issues/178)的功能请求。也许在将来的版本中,它可以添加&#34;添加&#34;现有模拟的协议,但截至今天不支持。
答案 1 :(得分:1)
似乎OCMock目前不支持此功能。
我想要模拟的类是MPMediaItem
,所以要解决这个限制..我只是将MPMediaItem
子类化并使该子类实现该协议:
@interface VBLoggableMediaItem : MPMediaItem <VBLoggableProtocol>
@end
@implementation VBLoggableMediaItem
# pragma mark - VBLoggableProtocol
..
- (NSString *)idStr
{
return self.title;
}
@end
然后我嘲笑了那个子类:
-(VBLoggableMediaItem*) mockRandomMediaItem
{
VBLoggableMediaItem* mock = OCMStrictClassMock([VBLoggableMediaItem class]);
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"mock://%@", randomString(10)]];
...
OCMStub([mock title]).andReturn(title);
OCMStub([mock idStr]).andReturn(title);
return mock;
}
答案 2 :(得分:0)
正如Erik Doernenburg指出的那样,OCMock目前无法做到这一点。作为一种解决方法,您可以将新类定义为要测试的子类,以实现所需的所有协议。
@interface TestClass : SomeClass <SomeProtocol>
@end
@implementation TestClass
@end
在您的测试方法中,您可以使用TestClass
作为模拟SomeClass
和SomeProtocol
id testClass = OCMClassMock([TestClass class]);