8

我正在学习用于 iOS 测试的 OCMock。“类模拟”和“部分模拟”有什么区别,什么时候应该使用一个与另一个?

http://ocmock.org/features/

4

1 回答 1

14

Class mocks创建纯粹模拟类实例的对象。

Partial mocks获取一个类的实例,并允许您对它的任何方法进行存根。

假设我有这些课程:

@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:方法很感兴趣。我希望它调用doX一个Foo对象,然后调用它自己的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 的任何真正功能,所以我使用了类模拟。

于 2013-08-18T02:05:43.437 回答