2016-02-13 33 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