如何 'reverse' 一个 promise 的 rejection/fulfillment?
How to 'reverse' the rejection/fulfillment of a promise?
对于 mocha 测试,我想断言一个 promise 最终会被拒绝。
我不想像承诺的那样使用 chai。我更愿意只使用 Node 的标准断言模块,并且只使用标准的 ES6 承诺。
我想到的最好的是这个,但感觉有点老套:
it('foo should reject given bad data', function () {
var rejected;
return foo('bad data').catch(function (err) {
rejected = true;
}).then(function () {
assert(rejected);
});
});
谁能建议一种更简洁、更具表现力的方式来 'reverse' 承诺,这样拒绝就变成了履行,反之亦然?
您可以直接对通过 true
或 false
的解决和拒绝回调进行断言。
it('foo should reject given bad data', function () {
return foo('bad data').then(function () {
assert(false);
}, function () {
assert(true);
});
});
您可以像这样使用单个 .done()
来做到这一点:
it('foo should reject given bad data', function () {
return foo('bad data')
.done(assert.equal.bind(null, 'false', 'true', null), assert);
});
我使用了 assert.equal
的值,它将提供 assert(false)
的等效值,但如果您想打印实际结果,您显然可以删除最后一个 null
。
编辑: 您实际上可以通过定义您自己的 assertFail
函数来为多个测试清洁此程序:
function assertFail () { assert(false); }
it('foo should reject given bad data', function () {
return foo('bad data')
.done(assertFail, assert);
});
您可以在 Promise 原型中添加一个反向方法,然后直接使用它。
Promise.prototype.reverse = function() {
return new Promise((resolve, reject) => {
this.then(reject).catch(resolve);
});
}
foo('bad data')
.reverse()
.then(e => assert(true))
.catch(e => assert(false));
对于 mocha 测试,我想断言一个 promise 最终会被拒绝。
我不想像承诺的那样使用 chai。我更愿意只使用 Node 的标准断言模块,并且只使用标准的 ES6 承诺。
我想到的最好的是这个,但感觉有点老套:
it('foo should reject given bad data', function () {
var rejected;
return foo('bad data').catch(function (err) {
rejected = true;
}).then(function () {
assert(rejected);
});
});
谁能建议一种更简洁、更具表现力的方式来 'reverse' 承诺,这样拒绝就变成了履行,反之亦然?
您可以直接对通过 true
或 false
的解决和拒绝回调进行断言。
it('foo should reject given bad data', function () {
return foo('bad data').then(function () {
assert(false);
}, function () {
assert(true);
});
});
您可以像这样使用单个 .done()
来做到这一点:
it('foo should reject given bad data', function () {
return foo('bad data')
.done(assert.equal.bind(null, 'false', 'true', null), assert);
});
我使用了 assert.equal
的值,它将提供 assert(false)
的等效值,但如果您想打印实际结果,您显然可以删除最后一个 null
。
编辑: 您实际上可以通过定义您自己的 assertFail
函数来为多个测试清洁此程序:
function assertFail () { assert(false); }
it('foo should reject given bad data', function () {
return foo('bad data')
.done(assertFail, assert);
});
您可以在 Promise 原型中添加一个反向方法,然后直接使用它。
Promise.prototype.reverse = function() {
return new Promise((resolve, reject) => {
this.then(reject).catch(resolve);
});
}
foo('bad data')
.reverse()
.then(e => assert(true))
.catch(e => assert(false));