我有一个返回(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中测试承诺的舒适解决方案?
答案 0 :(得分:3)
这里的派对来不及,但万一其他人发现了这个问题(就像我一样) - 这是一个新答案:使用我的'jasmine-es6-promise-matchers'组件。使用它,上面的测试将如下所示:
var promise = functionThatReturnsAPromise();
expect(promise).toBeResolvedWith("Hello World");
它可以在Bower和NPM上使用(仅install jasmine-es6-promise-matchers
)。
答案 1 :(得分: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");
});
});
});
但是,如果你坚持使用本机承诺并且你不能使用摩卡 - 你拥有的东西可能是唯一的替代品,你可以将模式提取到一个方法中:
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
});