我在集成测试中使用的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恢复补丁?
答案 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中为某些测试方法回滚修补组件,您应该使用上面提到的解决方案。