使用Jest-竞争条件对代码进行通用测试

时间:2018-11-29 02:07:24

标签: javascript unit-testing testing jestjs race-condition

我刚刚意识到我所有的测试代码都具有竞争条件。

我的样式模式如下:

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并不是特别出色,而且该系统仍处于开发初期。

1 个答案:

答案 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块之前一样,我将具有相同的行为:/