Javascript 如何用Jasmine 2.0测试ES6承诺?

Javascript 如何用Jasmine 2.0测试ES6承诺?,javascript,jasmine,promise,es6-promise,Javascript,Jasmine,Promise,Es6 Promise,我有一个返回(ES6)承诺的函数,我想写一个Jasmine测试,检查它是否成功解析,解析值是否正确。我该怎么做 这是我目前发现的方式,但至少很无聊: describe("Promises", function() { it("should be tested", function(done) { var promise = functionThatReturnsAPromise(); promise.then(function(result) { expect(r

我有一个返回(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 2.0中不起作用,因为它使用了已被删除的
runs()


在Jasmine 2.0中,是否已经为测试承诺开发了合适的解决方案?

老实说,我会使用Mocha。在Mocha中,您可以简单地返回一个承诺,并且语法非常相似,因为您已经在使用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");
    });
  });
});
但是,如果您坚持本机承诺,而无法使用摩卡咖啡——您拥有的可能是唯一的选择,那么您可以将模式提取到一个方法中:

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

老实说?我会使用Mocha。在Mocha中,您只需返回一个承诺,语法非常相似,因为您已经在使用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");
    });
  });
});
但是,如果您坚持本机承诺,而无法使用摩卡咖啡——您拥有的可能是唯一的选择,那么您可以将模式提取到一个方法中:

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

在这里参加聚会有点晚了,但如果其他人发现这个问题(我也发现了)-这里有一个新的答案:使用我的“”组件。使用它,上面的测试将如下所示:

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

Bower和NPM(只需
安装jasmine-es6-promise-matchers
)上提供了它。

在这里参加聚会有点晚,但如果其他人发现这个问题(我也发现了),这里有一个新的答案:使用我的“”组件。使用它,上面的测试将如下所示:

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

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

反馈会更好我查看了Mocha,但它似乎只支持最新的浏览器(例如IE9/10+,具体取决于断言库),我现在宁愿避免使用(同时,我必须将所有断言重写为新格式)。itP解决方案不是最吸引人的,但它可能会起作用;不过我还没有足够的时间彻底测试它。我还在等待另一个库的帮助,该库旨在帮助测试RSVP承诺(ES6承诺基于RSVP)。反馈会更好。我查看了Mocha,但它似乎只支持最新的浏览器(例如,IE9/10+取决于断言库),目前我宁愿避免使用(同时,我必须将所有断言重写为新格式)。itP解决方案不是最吸引人的,但它可能会起作用;但我没有足够的时间对其进行彻底测试。我还在等待另一个库的帮助,该库旨在帮助测试RSVP承诺(ES6承诺基于RSVP)最后,我结束了这样的制作。此外,它支持测试用例之间的依赖关系。你太棒了!谢谢你分享。最后,我结束了这样的制作。此外,它支持测试用例之间的依赖关系。你太棒了!谢谢你分享。非常感谢!你的PR发布为2.0.2版。非常感谢恭喜!您的PR已发布为2.0.2版。