[英]Failing test - Mocha's done() called multiple times
我嘗試查看具有類似錯誤的主題,但無法將這些解決方案融入我的問題的上下文中。
當我嘗試運行以下測試時(包含的功能已測試):
function myFunc(next, obj) {
const pairs = {};
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
const err = new Error('This was not ok');
next(err);
} else {
pairs[element.x] = element.y;
}
});
next();
}
it('should fail as 9 has been changed to 5 in the second object of the listing', function (done) {
const callback = (err) => {
if (err && err instanceof Error && err.message === 'This was not ok') {
// test passed, called with an Error arg
done();
} else {
// force fail the test, the `err` is not what we expect it to be
done(new Error('Assertion failed'));
}
}
myFunc(callback, {
"listing": [
{ "x": 5, "y": 9 },
{ "x": 5, "y": 11 }
]
});
});
您需要在myFunc
的if
塊中添加一個return
,以便只調用一次回調next
並且確實在主測試用例中調用done()
回調:
function myFunc(next, obj) {
const pairs = {};
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
const err = new Error('This was not ok');
return next(err);
} else {
pairs[element.x] = element.y;
}
});
next();
}
@Ankif Agarwal 的解決方案不是正確的,但它確實為我指明了正確的方向。
forEach() 方法沒有短路,因此多次調用 next() ( 短路 Array.forEach 就像調用 break 一樣)。
我能夠以兩種方式之一解決這個問題。
通過從 forEach() 邏輯中提取對 next() 的調用:
function myFunc(next, obj) {
const pairs = {};
let err = null;
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
err = new Error('This was not ok');
} else {
pairs[element.x] = element.y;
}
});
if (err !== null) {
next(err);
} else {
next();
}
}
然而,這仍然使 forEach() 貫穿所有元素。 如果可能的話,最好將其短路並在發生設置錯誤的違規行為時立即將其斷開,如下所示:
function myFunc(next, obj) {
const pairs = {};
const BreakException = {};
let err = null;
try {
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
err = new Error('This was not ok');
throw BreakException;
} else {
pairs[element.x] = element.y;
}
});
next();
} catch (e) {
if (e !== BreakException) throw e;
next(err);
}
}
希望將來有人可以使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.