我刚刚意识到我所有的测试代码都具有竞争条件。
我的样式模式如下:
const myFunc = (callback) => {
return somePromise().then((result) => {
return someOtherPromise();
}).then((result) => {
db.end(() => {
callback();
});
}).catch((err) => {
db.end(() => {
callback(err);
});
});
};
我正在与Jest测试。测试代码看起来像这样。
it('should work', (done) => {
// mock stuff
let callback = () => {
expect(...);
done();
};
myFunc(callback);
});
我遵循此模式有许多功能和测试。我写的最后一个测试是在回调中给我一个Jest匹配器错误。经过一番困惑之后,我意识到第一次回调执行引发Jest错误,并且带有err参数的回调正在执行,并且在第一次回调执行调用done()之前失败。
我意识到这种模式可能绝对可怕。我已经通过按一定顺序进行某些Expect()调用来克服了竞争状况,但这是没有办法的。
如何在此处消除潜在的竞争条件?
我愿意完全改变自己的风格。我知道我的Javascript并不是特别出色,而且该系统仍处于开发初期。
答案 0 :(得分:0)
我的同事告诉我,这是使用异步/等待的一个好例子。
查看受测代码的新版本:
const myFunc = async (callback) => {
let other_result;
try {
let result = await somePromise();
other_result = await someOtherPromise(result);
} catch (err) {
db.end(() => {
callback(err);
});
return;
}
db.end(() => {
callback(null, other_result);
});
};
我做了一些更新,使它看起来更加真实。
我知道这使myFunc返回了一个promise,但这对于我的用例是可以的。这样,我确保回调仅执行一次,以防止Jest错误被其他地方捕获。
编辑:
我意识到这与将catch
块移到最后一个then
块之前一样,我将具有相同的行为:/