Ember.js 在控制器中测试异步操作

Ember.js Testing async action in controller

我有一个控制器,它有一个动作调用一个方法来做一些异步的事情和return一个承诺。

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");

问题是断言失败,因为在 运行 承诺得到解决并且成功处理程序中的所有内容都已完成之前。

如何在检查断言之前等待承诺解决?

如果您尝试这样做会怎样:

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");

方法有点老套,但可能行得通。

要测试异步方法,您可以使用测试助手 waitUntil 等待方法的预期 return,如下面的代码。

 controller.send('changeStepAsyncActionExample');                                   
 await waitUntil(() => {                                                     
   return 'what you expect to the Promise resolve';                                
 }, { timeout: 4000, timeoutMessage: 'Your timeout message' });

 // If not timeout, the helper below will be executed

 assert.ok(true, 'The promise was executed correctly');