如何通过TyphoonPatcher重置修补的组件

时间:2016-01-26 15:13:33

标签: objective-c typhoon kif integration-testing

我在集成测试中使用的TyphoonPatcher有问题。我正在使用KIF进行集成测试。有时我需要存根http客户端或类负责在数据库中保存数据。最简单的方法是使用TyphoonPatcher。

让我们说我需要修补补丁骑士为TestCase A扼杀骑士,对于所有测试用例,所以我在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恢复补丁?

2 个答案:

答案 0 :(得分: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]);
}

通常使用单独的台风进行测试:

另请注意,在 general 中,我们建议您使用单独的Typhoon实例进行测试。这样做时,不需要分离修补程序。但是,如果它更适合您的特定情况,那么分离是可行的方法。

答案 1 :(得分:0)

通常,如果您想要删除已修补的组件,并且为下一个KIFTestCase测试提供明确的状态,则可以为一个测试用例修补组件:

exit(0)
<{1>}中的

,例如:

afterAll

请注意,这只适用于运行TestCase,我想在TestCase中为某些测试方法回滚修补组件,您应该使用上面提到的解决方案。