【问题标题】:How to test ES6 promises with Jasmine 2.0?如何使用 Jasmine 2.0 测试 ES6 Promise?
【发布时间】:2015-06-13 22:04:55
【问题描述】:

我有一个返回 (probably shimmed) ES6 承诺的函数,我想编写一个 Jasmine 测试来检查它是否成功解析并且解析的值是否正确。我该怎么做?

这是我目前找到的方式,但至少很无聊:

describe("Promises", function() {
  it("should be tested", function(done) {
    var promise = functionThatReturnsAPromise();
    promise.then(function(result) {
      expect(result).toEqual("Hello World");
      done();
    }, function() {
      expect("promise").toBe("successfully resolved");
      done();
    });
  });
});

还有一个名为 jasmine-as-promised 的库似乎很有帮助,但遗憾的是它在 Jasmine 2.0 中不起作用,因为它使用已被删除的 runs()

是否已经为测试 Jasmine 2.0 中的 Promise 开发了任何舒适的解决方案?

【问题讨论】:

  • 反馈会很好
  • 我查看了 Mocha,但它似乎只支持最近的浏览器(例如 IE9/10+ 取决于断言库),我现在宁愿避免使用(另外,我必须将所有断言重写为新格式)。 itP 解决方案不是最吸引人的,但它可能会奏效;我还没有足够的时间来彻底测试它。我也在等待另一个库的帮助,该库旨在帮助测试 RSVP 承诺(ES6 Promises 基于 RSVP)github.com/jasmine-addons/jasmine_rsvp/issues/1

标签: javascript jasmine promise es6-promise


【解决方案1】:

在这里聚会有点晚了,但万一其他人发现了这个问题(就像我一样) - 这是一个新的答案:使用我的 'jasmine-es6-promise-matchers' 组件。使用它,您上面的测试将如下所示:

var promise = functionThatReturnsAPromise();
expect(promise).toBeResolvedWith("Hello World");

它在 Bower 和 NPM 上可用(只需 install jasmine-es6-promise-matchers)。

【讨论】:

  • 非常感谢!您的 PR 已发布为 2.0.2 版。
【解决方案2】:

说实话?我会用摩卡。在 Mocha 中,您可以简单地返回一个 Promise,并且语法非常相似,因为您已经使用 Mocha 的语法进行异步测试。它看起来像:

describe("Promises", function() {
  it("should be tested", function() {
    var promise = functionThatReturnsAPromise();
    return promise.then(function(result) {
      expect(result).toEqual("Hello World");
    }, function() {
      expect("promise").toBe("successfully resolved");
    });
  });
});

但是,如果您受困于原生承诺并且无法使用 mocha - 您所拥有的可能是唯一的选择,您可以将模式提取到方法中:

function itP(description, itfn){
    it(description, function(done){
        var result = itfn(); // call the inner it
        if(result.then) { // if promise was returned
            result.then(done, function(e){
                throw new Error("Async rejection failed " + e.message); 
            }); // resolve means done, reject is a throw
        } else {
            done(); // synchronous
        }
    }); 
}

itP("something", function(){
   return Promise.reject(); // this turns into a failed test
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多