2016-02-13 61 views
0

我有一個控制器,其中有一個動作調用一個方法來執行一些異步的東西並返回一個承諾。Ember.js在控制器中測試異步動作

export default Ember.Controller.extend({ 

    _upload: function() { 
    // return a promise 
    }, 
    actions: { 
    save: function(item) { 
     this._upload(item).then(function(response) { 
     // Handle success 
     }, function(error) { 
     // Handle error 
     } 
    } 
    } 
}); 

我想單元測試Handle successHandle error下的代碼。 在我的單元測試,我嘲笑了_uploadMethod使用

controller.set("_upload", function() { 
    return new Ember.RSVP.Promise(function(resolve) { 
    resolve({name: "image1"}); 
    }); 
}); 

然後我調用的行動,並斷言,成功處理程序所做的是工作

controller.send("save", "item"); 
assert.equal(controller.get("selected.item"), "item"); 

的問題是,斷言失敗,因爲它在承諾解決之前運行並且所有成功處理程序中的內容都已完成。

如何在斷言被檢查之前等待承諾解決?

回答

0

如果你嘗試一下這個來代替:

controller.set("_upload", function() { 
    const promise = new Ember.RSVP.Promise(function(resolve) { 
    resolve({name: "image1"}); 
    }); 

    promise.then(() => Ember.run.next(() => { 
    assert.equal(controller.get("selected.item"), "item"); 
    })); 

    return promise; 
}); 

controller.send("save", "item"); 

有點哈克的方式,但它可能工作。

+0

它的工作原理,謝謝。 – GUL