1

我有一个函数返回一个(可能已填充) 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 开发了任何舒适的解决方案?

4

2 回答 2

3

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

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

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

于 2015-03-14T15:06:09.720 回答
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
});
于 2014-08-16T18:38:07.697 回答