Typhoon 台风-如何注入在xib文件中定义的UIView?

Typhoon 台风-如何注入在xib文件中定义的UIView?,typhoon,Typhoon,我想在视图控制器中插入一个视图,以便在单元测试中插入一个模拟视图(wpdependencyninjectorimplementation是我的typhonassembly子类) 我理想的loadView方法如下所示: - (void)loadView { WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly default

我想在视图控制器中插入一个视图,以便在单元测试中插入一个模拟视图(
wpdependencyninjectorimplementation
是我的
typhonassembly
子类)

我理想的
loadView
方法如下所示:

- (void)loadView {
    WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly defaultAssembly];
    self.view = [injectorAssembly someView];
}
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"WPSomeView" owner:nil options:nil];
return [views firstObject];
鉴于从xib创建视图的代码如下所示,我不确定该定义是什么样的,或者是否可能:

- (void)loadView {
    WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly defaultAssembly];
    self.view = [injectorAssembly someView];
}
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"WPSomeView" owner:nil options:nil];
return [views firstObject];

没错,您只需覆盖loadView,而不是从容器中查找视图,如图所示,您应该通过初始值设定项或属性设定项提供视图。然后在loadView中,将其设置为注入视图,如下所示:

- (void)loadView 
{
    [self.view = _myInjectedView]; //Do this rather than looking it up via the TyphoonFactory - easier to test. 
}
如果您这样做:

  • 您可以通过视图的实际类型引用视图,而不是从UIView向下转换
  • 在纯单元测试中模拟将非常简单。(不需要刷牙、刷牙等)
下面是一个例子:

- (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注射

我们实际上还没有一个锡伯橡胶工厂可以为您提供。使用与发出主题的对象类似的模式来定义一个主题应该是一项快速的工作,这样您就可以在DI容器中为每个基于Xib的视图创建一个组件,并直接注入该组件

或者你可以使用我们的新产品


如果您陷入困境,请让我们知道,我们中的一位将抽出一些时间为您创建并推动Xib视图工厂

没错,您只需覆盖loadView,而不是从容器中查找视图,如图所示,您应该通过初始值设定项或属性设定项提供视图。然后在loadView中,将其设置为注入视图,如下所示:

- (void)loadView 
{
    [self.view = _myInjectedView]; //Do this rather than looking it up via the TyphoonFactory - easier to test. 
}
如果您这样做:

  • 您可以通过视图的实际类型引用视图,而不是从UIView向下转换
  • 在纯单元测试中模拟将非常简单。(不需要刷牙、刷牙等)
下面是一个例子:

- (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注射

我们实际上还没有一个锡伯橡胶工厂可以为您提供。使用与发出主题的对象类似的模式来定义一个主题应该是一项快速的工作,这样您就可以在DI容器中为每个基于Xib的视图创建一个组件,并直接注入该组件

或者你可以使用我们的新产品


如果您陷入困境,请让我们知道,我们中的一位将抽出一些时间为您创建并推动Xib视图工厂

谢谢你的建议,我已经选择了注入视图方法,我认为它绝对适合测试。我将研究一下您关于加载xib视图的建议。不客气。如果您需要有关xib视图工厂的帮助,请在GitHub中记录一个问题,我们将创建一个问题。否则,如果你自己完成的话,我们真的希望得到一个pull请求。谢谢你的建议,我选择了注入视图的方法,我认为它绝对适合测试。我将研究一下您关于加载xib视图的建议。不客气。如果您需要有关xib视图工厂的帮助,请在GitHub中记录一个问题,我们将创建一个问题。否则,如果你自己完成的话,我们希望你能提出一个请求。