是否可以使用OCMock来模拟类方法和协议?

时间:2015-02-21 12:16:13

标签: ios objective-c iphone unit-testing ocmock

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

但我不知道如何......想法?

3 个答案:

答案 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作为模拟SomeClassSomeProtocol

id testClass = OCMClassMock([TestClass class]);