2013-12-10 30 views
1

我想注入一個視圖到我的視圖控制器,以便我可以在我的單元測試中注入一個模擬視圖(WPDependencyInjectorImplementation是我的TyphoonAssembly子類)。颱風 - 如何注入在xib文件中定義的UIView?

我的理想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]; 

回答

1

這是正確的,你只需要重寫的loadView,而不是仰視從容器的觀點,因爲你已經證明,你應該提供通過初始化或屬性setter的看法。然後在的loadView而言,如下設定注入的觀點:

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

如果你做這種方式:

  • 你可以參考視圖通過它的實際類型,而不是向下鑄造來自UIView
  • 在純粹的單元測試中嘲笑它真的很簡單。 (不需要TyphoonPatcher,swizzling等)。

下面是一個例子:

- (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工廠,我們可以爲您提供呢。使用與發佈主題here的對象類似的模式定義一個應該很快,因此您將在每個基於Xib的視圖的DI容器中都有一個組件,並直接注入該組件。

或者,您可以使用我們的新TyphoonFactoryProvider

如果您遇到困難,請告訴我們,我們其中一人會找一些時間爲您創建並推送Xib-view-factory。

+0

感謝您的建議,我已經使用了注入視圖方法,我認爲這對測試來說絕對更好。 我會看看你的加載xib-views的建議。 – titch

+0

不客氣。如果您需要xib-view工廠的幫助,請在GitHub中登錄一個問題,我們將創建一個問題。否則,如果你自己完成它,我們會喜歡這個實際的拉取請求。 –

相關問題