将 Promise.all 与断言结合使用

Joe*_*dee 2 assert mocha.js promise

我有一个小测试(Mocha/Chai),它测试 encryptPass 函数返回正确的哈希值:

const assert = require('chai').assert;
const bcrypt = require('bcrypt');
var encryptPass = require('../../shared/helpers/encryptPass.js');
var createUUID = require('../../shared/helpers/createUUID.js');

describe('encryptPass', function() {
    it('returns correct password hash', () => {
        var pass = createUUID();
        var encryptedPass = encryptPass(pass);
        Promise.all([pass, encryptedPass]).then(values => {
            let [pass, encryptedPass] = values;
            var compareResult = bcrypt.compareSync(pass, encryptedPass);
            assert.equal(compareResult, true);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

我担心的是,断言假设 Promise.all 函数将正常工作而不会抛出错误。如何最好地处理这个问题?

Lou*_*uis 6

只需返回测试结果的承诺:

it('returns correct password hash', () => {
    var pass = createUUID();
    var encryptedPass = encryptPass(pass);
    // Just return...
    return Promise.all([pass, encryptedPass]).then(values => {
        let [pass, encryptedPass] = values;
        var compareResult = bcrypt.compareSync(pass, encryptedPass);
        assert.equal(compareResult, true);
    });
});
Run Code Online (Sandbox Code Playgroud)

这将负责告诉 Mocha 您的测试是异步的。在您的原始代码中,Mocha 不会等待测试完成。返回承诺会迫使它等待。其次,通过返回承诺,您还可以控制测试是否成功。如果任何传递给的 PromisePromise.all被拒绝,则测试失败。如果处理程序中的代码.then失败,那么这也是测试失败。例如,如果assert.equal失败,AssertionError则会引发 an ,这会导致承诺拒绝,Mocha 将其视为失败。