2016-01-26 9 views
3

У меня проблема с TyphoonPatcher, используемым в тестах интеграции. Я использую KIF для тестов интеграции. Иногда мне нужно заглушить http-клиент или класс, ответственный за сохранение данных в базе данных. Самый простой способ - использовать TyphoonPatcher.Как восстановить исправленные компоненты TyphoonPatcher

Позволяет сказать, что мне нужен патч патч рыцаря погасил рыцарь для TestCase А, для всех тестовых случаев, так что я делаю это в beforeAll обратного вызова

код отвечает за Patching компонента:

MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate]; 

TyphoonPatcher* patcher = [[TyphoonPatcher alloc] init]; 
[patcher patchDefinitionWithSelector:@selector(knight) withObject:^id{ 
Knight* mockKnight = mock([Knight class]); 
[given([mockKnight favoriteDamsels]) willReturn:@[ 
    @"Mary", 
    @"Janezzz" 
]]; 

return mockKnight; 

}]; 

[assembly attachPostProcessor:patcher]; 

Knight* knight = [(MiddleAgesAssembly*) factory knight] 

И теперь в TestCase B я хочу иметь ясное состояние приложения, без каких-либо исправленных компонентов.

Проблема? Рыцарь в классе B по-прежнему заменяется другим издеваемым или заглушенным классом.

Есть ли способ вернуть патч от TestCase A?

ответ

1

TyphoonPatcher является своего рода TyphoonAbstractDetachableComponentFactoryPostProcessor, поэтому вы можете просто вызвать метод patcher detach. Обратите внимание, что это работает только в том случае, если патчер является последним почтовым процессором. Тайфун не знает, как снять состояние на произвольной глубине.

** Пример: **

- (void)test_allows_detaching_patcher 
{ 
    [self applyAPatch]; 
    [self assertPatchApplied]; 

    XCTAssertFalse([_assembly componentForKey:@"knight"] == [_assembly componentForKey:@"knight"]); 
    XCTAssertTrue([_assembly componentForKey:@"cavalryMan"] == [_assembly componentForKey:@"cavalryMan"]); 

    [_patcher detach]; 

    Knight *knight = [_assembly componentForKey:@"knight"]; 
    LogDebug(@"%@", [knight favoriteDamsels]); 
} 

Обычно используют отдельный Typhoon для испытаний:

отметить также, что в общем мы рекомендуем использовать отдельный экземпляр Typhoon для тесты. При этом не нужно отсоединять патчер. Однако, если вам подходит лучше для конкретного случая, тогда отсоедините путь.

0

Обычно componenets заделаны в течение одного теста, если вы хотите избавиться от исправленных компонентов, и имеют четкое положение для последующих тестов KIFTestCase вы можете просто положить:

exit(0) 

в afterAll, как:

- (void)afterAll { 
    [super afterAll]; 
    exit(0); 
} 

Помните, что это работает только между запуском TestCase, i вы хотите откатить исправленный компонент для некоторых методов тестирования в TestCase, вы должны использовать решение, упомянутое выше.