如何在加入的promises /中测试逻辑

时间:2014-07-30 18:15:29

标签: ember.js

我正在尝试为我的一个组件上的动作处理程序编写测试。我在我的一个模型上删除save方法,以使用Em.RSVP.Promise.resolve()

返回已解决的承诺

在我的组件中,我使用then链接该承诺:

return target .save() .then(function(){ selected.rollback(); this.sendAction('quicklinkChanged', target); }.bind(this),this.notify_user_of_persistence_error.bind(this, 'Save As'));

这是一种模式,我使用很多服务器端,我们使用when作为我们的promise库。但是,当我这样做客户端时,我永远不会在then块中的函数内部结束,所以我无法断言我的单元测试中的任何功能。

任何人都可以提供有关最佳方法的任何见解吗?

1 个答案:

答案 0 :(得分:2)

我们将回调移出方法,因此我们可以单独调用它们并验证功能,或者替换它们并验证它们是否被调用。

控制器示例:

App.IndexController = Em.Controller.extend({
  randomProperty: 1,
  async: function(fail){
    return new Em.RSVP.Promise(function(resolve, reject){
      if(fail){
        reject('fdas');
      }else{
        resolve('foo');  
      }
    });
  },
  doAsyncThing: function(fail){
    return this.async(fail).then(this.success.bind(this), this.failure.bind(this));
  },
  success: function(){
    this.set('randomProperty', 2);
  },
  failure: function(){
    this.set('randomProperty', -2);
  }
});

测试

test("async success", function(){
  var ic = App.IndexController.createWithMixins();
  stop();
  ic.doAsyncThing(false).then(function(){
    start();
    equal(ic.get('randomProperty'), 2);
  });

});

test("async fail", function(){
  var ic = App.IndexController.createWithMixins();
  stop();
  ic.doAsyncThing(true).then(function(){
    start();
    equal(ic.get('randomProperty'), -2);
  });

});

test("async success is called", function(){
  expect(1);
  var ic = App.IndexController.createWithMixins();
  ic.success = function(){
    ok(true);
  };
  stop();
  ic.doAsyncThing(false).then(function(){
    start();
  });

});

test("async failure is called", function(){
  expect(1);
  var ic = App.IndexController.createWithMixins();
  ic.failure = function(){
    ok(true);
  };
  stop();
  ic.doAsyncThing(true).then(function(){
    start();
  });

});

test("doAsyncThing returns a promise", function(){
  expect(1);
  var ic = App.IndexController.createWithMixins();
  ok(ic.doAsyncThing(true).then);

});

示例:http://emberjs.jsbin.com/wipo/37/edit