2016-01-26 31 views
3

我在集成測試中使用的TyphoonPatcher有問題。我正在使用KIF進行集成測試。有時我需要存儲http數據庫中負責保存數據的客戶端或類。最簡單的方法是使用TyphoonPatcher。如何重置由TyphoonPatcher修補的組件

比方說,我需要打補丁的補丁騎士的TestCase的一個存根騎士,對於所有的測試案例,所以我在beforeAll回調做這個

代碼負責修補組件:

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所以你可以簡單地調用修補器的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]); 
} 

一般用於測試單獨颱風:

還要注意的是,在一般我們建議您使用的颱風爲一個單獨的實例試驗。當這樣做時,應該沒有必要分離修補程序。但是,如果它更適合您的特定情況,那麼分離就是要走的路。

0

通常其它的組件進行修補了一個測試的情況下,如果你想擺脫修補的組件,並且對下一KIFTestCase測試境界清楚你可以把:

exit(0) 

afterAll,如:

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

請注意,這僅適用於運行TestCase之間,我想回滾TestCase中某些測試方法的補丁組件,您應該使用上述解決方案。