2016-09-21 42 views
0

我正在面對與我的組件集成測試之一有關的問題。簡單地解釋一下,我的組件使用一個子組件,它使用一些可以選擇的選項來顯示。Ember測試:在組件測試中注入控制器

這些能力依賴於控制器來知道哪些是當前項目,因此用戶的權限是什麼。因此,在我們app.js文件,我們有這樣的事情:

application.inject('ability', 'projectController', 'controller:project'); 

當然,在做集成測試的組件時,能力是無法找到的控制器,也沒有項目,所以總是考慮用戶沒有所需的權限。

我試過到目前爲止這樣的東西:

this.register('controller:project', Ember.Object.create({ 
    project: this.project 
})); 
this.inject.controller('controller:project', {as: 'projectController'}); 

但是,這並不會對能力造成任何影響(測試文檔說明如何注入服務,而且是相當差的控制器注入)。

有沒有人有如何解決這個問題的好主意?

最好的問候, 文森特

+0

您可以通過執行'Ember.inject.controller('controllername')'在另一個控制器中注入控制器,並將所需的屬性傳遞給組件。我不確定你在找什麼可能讓我們等待答案。 – kumkanillam

回答

0

什麼你正在努力實現似乎stubing的東西在你的應用程序的測試目的。鑑於您正在進行組件集成測試,我會假設您通過moduleForComponentember-qunit這樣做,它依賴於ember-test-helperspackageTestModuleForComponent。根據設置的needs:[...],integration: true/falseunit: true/false屬性的組合,此模塊的設置將有所不同。然而,如果你通過設置integration: true或指定needs: ['some']做集成測試,你可以從你的測試範圍內訪問所有者是這樣的:

test('my test', function(assert) { 
    const owner = Ember.getOwner(this); 
}); 

你的主人後,你可以在上面做lookup。對於你的情況,你也可以使用containerregisterunregister像這樣:

test('my test', function(assert) { 
    this.container.unregister('controllers:my-controller'); 
    this.container.register('controllers:my-controller', ActualController.extend({ 
     someStubbedProp: 'value' 
    }), {instantiate: false}); 
}); 

請注意,如果你正在處理單一對象(如IE適配器)要指定{instantiate: false},以確保它們不會實例化註冊時間,因爲它們將在應用程序啓動時實例化。

您可以使用相同的技術將控制器「注入」任何您想要的應用程序中。但是這種技術實際上不會真正注入一件事到另一個,但它允許通過你磕碰的屬性來訪問IE控制:通過訪問ActualControllersomeStubbedInjection道具,你會獲得這些數據

test('my test', function(assert) { 
    this.container.unregister('controllers:my-controller'); 
    this.container.register('controllers:my-controller', ActualController.extend({ 
     someStubbedInjection: Ember.computed({ 
      get(){ 
       return Ember.getOwner(this).lookup('controller:some-other-controller-you-want-to-access'); 
      } 
     }) 
    }), {instantiate: false}); 
}); 

之後。