2015-11-02 50 views
0

我有一個按照此答案https://stackoverflow.com/a/29816081/2482265使用store: Ember.inject.service()的組件。當用戶點擊提交在存儲中創建一個新的記錄 - 例如:如何在組件集成測試中將測試模型成功添加到商店中

var address = { 
    line1: this.get('line1'), 
    line2: this.get('line2'), 
    line3: this.get('line3'), 
    town: this.get('town'), 
    county: this.get('county'), 
    postCode: this.get('postCode'), 
    account: account 
}; 

var record = this.get('store').createRecord('address', address); 

record.save().then(() => { ... }); 

我現在想寫集成測試此組件,我填寫的字段,然後觸發提交按鈕點擊,這一切都很好,但我如何檢查一個地址被添加到商店?

我看到的

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

提及,但不能工作了最後一步,給我一個有用的斷言。

更新 我的一些部件的火在record.save().then()一個動作,所以我可以訂閱這個測試與正常this.on('assertMyAction',() => { ... })。但是我的一些組件不需要重新啓動一個動作,所以我需要一種不同的方法來知道store.record.save在檢查記錄中的某些更精細的屬性之前已經被填充。

+0

好,記錄被添加到存儲,當你叫createRecord。你想檢查它是否成功保存? –

+0

我想檢查兩者,檢查它是否已添加,並檢查它是否成功。 – Knightsy

回答

2

好吧,記錄被添加到商店,當你打電話createRecord。我的意思是它應該被添加到實時陣列中,但是屬性isNew設置爲true

如果你想檢查是否記錄已成功保存你使用這樣的:

let store = lookup('store:main'); 
assert.equal(store.all('user').get('length'), 1); 

store.find('user', userId).then((user) => { 
    assert.equal(user.get('isDirty'), false); 
    assert.equal(user.get('isNew'), false); 
}); 

之前保存您應該檢查isNew等於true。保存後,您還可以檢查屬性,如isValid,isError。你可以找到更多可能有用的屬性here

灰燼2.0 您將需要使用this.container.lookup('service:store');而非store:main

+0

謝謝!我的一些組件在記錄保存的「然後」中激發一個動作。所以我在測試中訂閱了這一點,並檢查isNew是否爲false等。我的一些組件不會觸發這樣的動作,所以我可以檢查長度爲1,比如'store.all('user')。get('length' )',有沒有辦法等待記錄完成保存? – Knightsy

+0

由於目前'user.get('isNew')'對於這些組件來說是真的,並且一個簡單的'setTimeout((=){>})不會削減它。 – Knightsy

+0

在我的測試中'Ember.run.later'完成了這項工作,但沒有記錄。我認爲你必須公開一些你的測試的承諾或鉤子,然後明確訂閱這些方法。如果您在觸發請求之前有記錄的實例,則可以嘗試使用didLoad,model的更新事件。 http://emberjs.com/api/data/classes/DS.Model.html#event_didUpdate –