我想在我的视图控制器中注入一个视图,以便在单元测试中注入模拟视图(WPDependencyInjectorImplementation
是我的TyphoonAssembly
子类)。
我理想的loadView
方法如下所示:
- (void)loadView {
WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly defaultAssembly];
self.view = [injectorAssembly someView];
}
我不确定这个定义是什么样的,或者是否可能,因为从xib创建视图的代码如下:
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"WPSomeView" owner:nil options:nil];
return [views firstObject];
答案 0 :(得分:1)
这是正确的,你只是覆盖loadView,而不是从容器中查找视图,如你所示,你应该通过初始化器或属性设置器提供视图。然后在loadView中,将其设置为注入视图,如下所示:
- (void)loadView
{
[self.view = _myInjectedView]; //Do this rather than looking it up via the TyphoonFactory - easier to test.
}
如果你这样做:
以下是一个例子:
- (id)userDetailsController
{
return [TyphoonDefinition withClass:[UserDetailsController class] initialization:^(TyphoonInitializer* initializer)
{
initializer.selector = @selector(initWithSession:userDetailsView:);
[initializer injectWithDefinition:[self session]];
[initializer injectWithDefinition:[self userDetailsView]];
}];
}
- (id)userDetailsView
{
return [TyphoonDefinition withClass:[UserDetailsView class]
properties:^(TyphoonDefinition* definition)
{
//circular dependency. Can also be set within VC.
[definition injectProperty:@selector(delegate)
withDefinition:[self userDetailsController]];
[definition injectProperty:@selector(sideMargin)
withValueAsText:@"${view.field.default.side.margin}"];
}];
}
从Xib注入
我们实际上没有可以为您提供的Xib工厂。使用与发出主题here的对象类似的模式来定义一个应该是一个快速的工作,因此您将在每个基于Xib的视图的DI容器中都有一个组件,并且只需注入直。
或者,您可以使用新的TyphoonFactoryProvider。
如果您遇到困难,请告诉我们,我们其中一人会找一些时间来为您创建和推送Xib-view-factory。