iOS OCMock部分模拟与类模拟

iOS OCMock部分模拟与类模拟,ios,ocmock,Ios,Ocmock,我正在学习iOS测试的OCMock。“类模拟”和“部分模拟”之间有什么区别?什么时候应该使用其中一种 类模拟创建纯类实例模拟的对象 部分模拟获取一个类的实例,并允许您存根它的任何方法 假设我有这些课程: @interface Foo : NSObject - (void)doX; @end @implementation - (void)doX { NSLog(@"X"); } @end @interface Bar : NSObject - (void)doA:(Foo *)foo;

我正在学习iOS测试的OCMock。“类模拟”和“部分模拟”之间有什么区别?什么时候应该使用其中一种


类模拟
创建纯类实例模拟的对象

部分模拟
获取一个类的实例,并允许您存根它的任何方法

假设我有这些课程:

@interface Foo : NSObject
- (void)doX;
@end
@implementation
- (void)doX
{
    NSLog(@"X");
}
@end

@interface Bar : NSObject
- (void)doA:(Foo *)foo;
- (void)doB;
@end
@implementation Bar
- (void)doA:(Foo *)foo
{
    NSLog(@"A");
    [foo doX];
    [self doB];
}
- (void)doB
{
    NSLog(@"B");
}
@end
我对测试Bar的
doA:
方法感兴趣。我希望它在
Foo
对象上调用
doX
,然后调用自己的
doB
方法。我将使用Foo的类模拟和Bar的部分模拟来实现这一点

- (void)test_doA_shouldCall_doX_and_doB
{
    id objectUnderTest = [OCMockObject partialMockForObject:[Bar new]];
    id fooMock = [OCMockObject mockForClass:Foo.class];
    [[fooMock expect] doX];
    [[objectUnderTest expect] doB];
    // Make the call
    [objectUnderTest doA:fooMock];
    [objectUnderTest verify];
    [fooMock verify];
}

您可以在这里看到,我的部分模拟允许我调用我想要测试的真实方法,同时模拟对其另一个实例方法的内部调用。因为我不需要Foo的任何真正功能,所以我使用了一个类模拟。

感谢您提供了非常有用的答案。我有两个后续问题:1)纯模拟不允许调用任何真正的方法,这是真的吗?2) 为什么不能创建Foo的部分模拟,然后对doX方法执行expect呢。纯模拟不受真实对象的支持,但从技术上讲,您可以通过使用
和调用
和执行
来设置任何模拟以调用任何方法——部分模拟允许您执行
和转发对象。2.您可以创建Foo的部分模拟——有时创建对象会产生副作用或涉及与测试无关的工作。此外,当调用意外的方法时,不是好的模拟的纯模拟会抱怨,而部分模拟则不会。