Objective c 如何使用TyphonPatcher重置已打补丁的组件
我对集成测试中使用的TyphonPatcher有问题。我正在使用KIF进行集成测试。有时我需要存根http客户机或类来负责在数据库中保存数据。最简单的方法是使用台风补丁 假设我需要补丁knight来为测试用例A和所有测试用例创建stubbed knight,所以我在beforeAll回调中这样做 负责修补组件的代码: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*
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中某些测试方法的修补组件,应使用上述解决方案