Objective c 如何使用TyphonPatcher重置已打补丁的组件

Objective c 如何使用TyphonPatcher重置已打补丁的组件,objective-c,typhoon,kif,integration-testing,Objective C,Typhoon,Kif,Integration Testing,我对集成测试中使用的TyphonPatcher有问题。我正在使用KIF进行集成测试。有时我需要存根http客户机或类来负责在数据库中保存数据。最简单的方法是使用台风补丁 假设我需要补丁knight来为测试用例A和所有测试用例创建stubbed knight,所以我在beforeAll回调中这样做 负责修补组件的代码: MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate]; TyphoonPatcher*

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

假设我需要补丁knight来为测试用例A和所有测试用例创建stubbed knight,所以我在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级的骑士仍然被其他被嘲弄或被钉死的等级所取代


有没有办法从测试用例A恢复补丁

typhonpatcher
是一种
typhonabstractabledetaccessablecomponentfactorypostprocessor
,因此您可以简单地调用补丁程序的
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]);
}
通常使用单独的台风进行测试:


另外请注意,通常我们建议您使用单独的Typhone实例进行测试。进行此操作时,无需拆下修补程序。但是,如果它更适合您的具体情况,那么分离是一种方法

通常情况下,为一个测试用例修补组件集,如果您想摆脱修补组件,并为下一个KIFTestCase测试清除状态,您可以只放置:

exit(0)
毕竟在
,例如:

- (void)afterAll {
    [super afterAll];
    exit(0);
}
请注意,这只在运行TestCase之间起作用,若要回滚TestCase中某些测试方法的修补组件,应使用上述解决方案