2016-01-13 46 views
0

這是Ember 2.2.0。我想用我的API服務器上的實時數據測試我的組件,使用ember-data不模擬來自測試幫助程序的數據,手動AJAX請求或者使用ember-cli-mirage之類的工具。目前,所有我在我的測試是這樣的代碼:如何在集成測試中訪問一個ember數據存儲實例?

import { moduleForComponent, test } from 'ember-qunit'; 
import hbs from 'htmlbars-inline-precompile'; 

moduleForComponent('checkbox-group', 'Integration | Component | checkbox group', { 
    integration: true 
}); 

test('it renders', function(assert) { 
    this.render(hbs`{{checkbox-group}}`); 
    assert.equal(this.$().text().trim(), ''); 
}); 

我想要做的是這樣的:

test('it renders', function(assert) { 
    const store = getStoreFromSomewhere(); 
    const model = store.find('data').then(() => { 
    this.render(hbs`{{checkbox-group data=model}}`); 
    // Do testing on component with model from server 
    }); 
}); 

的問題是我不知道如何讓存儲實例,另外我不知道異步測試是如何實現的。

該文檔不夠有用:/。有人可以讓我知道如何獲得商店實例,如果這是不可能的,另一種方式來做ember-data這個測試?

+0

檢查了我的舊測試,我知道「var store = this.store();」 –

+0

@kristjanreinhold沒有工作:( – m0meni

+0

也有導入「導入{測試,moduleForModel'從'ember-qunit';」>鏈接到完整測試=> http://dpaste.com/26GKG3G –

回答

2

我相信這更像驗收測試而不是集成測試。驗收測試設置整個應用程序,以便您可以測試該應用程序。

我相信,在集成測試你應該假冒模型,如:

test('it renders', function(assert) { 
    const modelValue = Ember.Object.create({ 
    prop1: value1, 
    prop2: value2, 
    }); 
    this.set('model', modelValue); 
    this.render(hbs`{{checkbox-group data=model}}`); 
    // Do testing on component with fake model 
    }); 
}); 

隨着中說,而且我覺得這個我會說是唯一有效的,直到灰燼2.2 (我相信Ember 2.3已經被棄用了)。您可以執行以下操作:

let store = this.container.lookup('service:store'); 

但是,如果您這樣做......您在使用商店時會出現錯誤。

「斷言失敗:你已經打開的測試模式,禁用 運行循環的自動運行您需要包裝在一個運行的異步 副作用的任何代碼」

哪意味着你需要用異步代碼在Ember.run

Ember.run(() => { 
    let store = this.container.lookup('service:store'); 
    store.findAll('post').then((posts) => { 
    //do stuff 
    }); 
}); 

我的兩分錢是,不要直接在集成測試使用的存儲。

1

moduleForComponent規範我相信cannonical的方式來做到這一點,像這樣:

var store = Ember.getOwner(this).lookup("service:store");

,而不是:

var store = this.container.lookup('service:store');

而且,你可以嘲笑它像這樣裏面的一個beforeEach

this.promise = new Ember.RSVP.Promise((resolve) => { 
    var response = anEmberObject; 
    resolve(response); 
}); 

this.storeMock = Ember.Service.extend({ 
    save:()=>{ 
    return this.promise; 
    }, 
    reload: (query)=>{ 
    return this.promise; 
    } 
}); 


Ember.getOwner(this).register('service:store', this.storeMock); 
Ember.getOwner(this).inject('component', 'store', 'service:store'); 
+0

會很高興由於getOwner在2.3之前不可用,並且使用polyfill仍然無法訪問集成測試中的存儲容器,所以知道它適用於哪種版本的Ember。lookup'在1.13中甚至不起作用... – kevlarr

相關問題