gpt4 book ai didi

ios - 如何使用 Typhoon 为集成测试注入(inject)假的、 stub 的或模拟的依赖项

转载 作者:搜寻专家 更新时间:2023-10-30 20:15:19 26 4
gpt4 key购买 nike

我正在尝试使用 KIF 编写集成测试。我的问题是:

How to inject stubbed, mock or fake dependency for particular view controller?

每个使用数据模型、http 客户端、商店管理器等依赖项的 View Controller 都来自 ModelAssembly、ApplicationAssembly、ManagerAssmebly。

在 Storyboard上,对于登录 View ,我有一个关键路径,包含值“loginViewController”。

创建 View Controller :

ViewControllersAssembly.h

@interface ViewControllersAssembly : TyphoonAssembly
@property (nonatomic, strong) ModelAssembly *modelAssembly;

- (id)loginViewController;
@end

ViewControllersAssembly.m

@implementation ViewControllersAssembly
- (UIViewController *)loginViewController {
return [TyphoonDefinition withClass:[LoginViewController class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(userModel) with:[self.modelAssembly userModel]];
}];

UserModel 有登录的方法

- (RACSingnal*)loginWithEmail:(NSString*)email password:(NSString*)password;

现在在集成测试目标中我有这样的类:

LoginTests.h

@interface LoginTests : KIFTestCase
@property (nonatomic, strong) UserModel *fakeUserModel;
@end

LoginTests.m

@implementation LoginTests

- (void)beforeAll {
self.fakeDataModel = [self mockDataModel];
}

- (void)testLogin {
[self.fakeDataModel mockNextResponse:[RACSignalHelper getGeneralErrorSignalWithError:[[NSError alloc] initWithDomain:@"http://some.com" code:452 userInfo:nil]]];
[tester waitForViewWithAccessibilityLabel:@"loginScreen"];

[tester enterText:@"user@gmail.com" intoViewWithAccessibilityLabel:@"emailAdress"];
[tester enterText:@"asd123" intoViewWithAccessibilityLabel:@"password"];
[tester tapViewWithAccessibilityLabel:@"loginButton"];

[tester tapViewWithAccessibilityLabel:@"OK"];
// for example error code 542 we should display alert with message "User Banned"
// now somehow check that UIAlertView localizedDescription was "User Banned"
}

- (FakeUserModel *)mockUserModel {
ModelAssembly *modelAssembly = [[ModelAssembly assembly] activate];
TyphoonPatcher *patcher = [[TyphoonPatcher alloc] init];
[patcher patchDefinitionWithSelector:@selector(userModel) withObject:^id{
return [FakeUserModel new];
}];

[modelAssembly attachDefinitionPostProcessor:patcher];
return [modelAssembly userModel];
}

FakeUserModel 是覆盖 UserModel 类的类,增加了对下一个调用请求 stub 响应的可能性。

该解决方案无效。

我应该如何以及在何处传递 FakeUserModel?

1) 我想访问注入(inject)的实例

2) 注入(inject)的实例必须是 FakeUserModel 类型,它只在集成测试目标中。

3) 我不想修改集成测试的生产代码。

最佳答案

单元测试

如果您希望用测试替身替换给定类的所有依赖项,从而在与其合作者隔离的情况下测试一个类,这将是一个单元测试。只需实例化一个实例进行测试,将您的测试替身(模拟、 stub 等)作为协作者传递。

集成测试

如果您希望使用测试替身修补程序集中的一个或多个实例,将系统置于集成测试所需的状态,Typhoon 提供了几种方法。

您可以按如下方式修补一个组件:

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]

有关此方法的更多信息,请参阅 Integration Testing用户指南的一部分。

模块化

或者,您可以模块化您的程序集,并使用子类或替代实现激活,它提供某些类的另一种实现,例如:

UIAssembly *uiAssembly = [[UIAssembly new] 
activateWithCollaboratingAssemblies:@[
[TestNetworkComponents new], //<--- Patched for testing
[PersistenceComponents new]];

SignUpViewController* viewController = [uiAssembly signUpViewController];

有关此方法的更多信息,请参阅 modularization section的用户指南。

关于ios - 如何使用 Typhoon 为集成测试注入(inject)假的、 stub 的或模拟的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34004010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com