2013-08-17 3 views

ответ

12

Class mocks создавать объекты, которые являются чистыми издеваются экземпляр класса.

Partial mocks Сделайте экземпляр класса a, чтобы вы могли заглушить любой из его методов.

Предположим, у меня есть эти классы:

@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 

Я заинтересован в doA: метод тестирования Бара. Я ожидаю, что он назовет doX на объекте Foo, а затем называть его собственным методом doB. Я бы реализовал это, используя макет класса Foo и частичный макет бара.

- (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, я использовал классный макет.

+0

Спасибо за действительно полезный ответ. У меня есть два вопроса: 1) Правда ли, что чистые издевательства не позволяют вам называть какие-либо реальные методы? 2) Почему вы не могли создать частичный макет Foo, а затем ожидать от метода doX? – user1802143

+1

1. Чистый макет не поддерживается реальным объектом, но технически вы можете настроить любой макет для вызова любого метода с помощью 'andCall' или' andDo' - частичный макет позволяет вам делать и andwardwardToRealObject'. 2. Вы можете создать частичный макет Foo - иногда создание объекта имеет побочные эффекты или предполагает работу, не относящуюся к вашему тесту. Кроме того, чистый макет, который не является хорошим макетом, будет жаловаться, когда вызывается неожиданный метод, тогда как частичный макет не будет. –