1

単体テストにモック ビューを挿入できるように、View Controller にビューを挿入したいと考えています (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];
4

1 に答える 1

1

そうです、コンテナからビューを検索するのではなく、loadView をオーバーライドするだけです。これまでに示したように、イニシャライザまたはプロパティ セッターを介してビューを提供する必要があります。次に、loadView で、次のように挿入されたビューに設定します。

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

このようにすると:

  • UIView からダウンキャストするのではなく、実際のタイプを介してビューを参照できます
  • 純粋な単体テストでモックアウトするのは非常に簡単です。( TyphoonPatcher、スウィズリングなどは必要ありません)。

次に例を示します。

- (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 ファクトリーはまだありません。ここでテーマを発行するオブジェクトと同様のパターンを使用して定義するのは簡単な仕事であるため、Xib ベースのビューごとに DI コンテナーにコンポーネントを用意し、それを直接注入するだけです。

または、新しいTyphoonFactoryProviderを使用することもできます。

行き詰まった場合はお知らせください。Xib-view-factory を作成してプッシュする時間を見つけます。

于 2013-12-10T12:27:34.643 に答える