gpt4 book ai didi

javascript - 如何使用 mocha/chai/chai-as-promised 测试 ES7 异步函数

转载 作者:数据小太阳 更新时间:2023-10-29 06:01:30 29 4
gpt4 key购买 nike

我有以下功能要测试:

// ...
const local = new WeakMap();

export default class User {

// ...

async password(password) {
if (!password) return local.get(this).get('hash'); // remove this for security reasons!
if (password.length < 6) throw new Error('New password must be at least 6 characters long');
if (!password.match(passwordPattern)) throw new Error(`New password must match ${passwordPattern}`);
local.get(this).set('hash', await Password.hash(password));
}

// ...

}

现在我想用 mocha 测试这个函数, chaichai-as-promised做这个测试用例:

import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';

import User from '../../../server/User';

chai.use(chaiAsPromised);
const expect = chai.expect;

describe('.password()', () => {

const testuser = new User({username: 'Testuser', password: '123abc'});

// FINDME
it(`should throw when too short`, () => {
return expect(testuser.password('1a')).to.eventually.throw();
});

// ...

});

在上面的代码中查找 //FINDME 注释以获取我所指的上下文。

所以发生的是测试不等待异步 password() 函数完成。正如我发现的 ECMAScript7 异步函数立即返回一个 thenable,所以它应该没问题,因为 chai-as-promised 使用了这个特性。我的猜测是,异步函数不会将错误抛出到上述 promise 中,而是将其抛入封闭函数本身,无法通过 expect() 捕获它。

对于急切的人:我使用 babel 即时转换这段代码使用以下命令:

babel-node --experimental node_modules/mocha/bin/_mocha --watch --recursive -R spec --check-leaks

Babel 6 更新:

使用 babel-node 6.4.0,以下工作正常:

npm install --save-dev babel-preset-stage-0

然后运行:

./node_modules/.bin/babel-node --presets stage-0 node_modules/mocha/bin/_mocha --    
recursive -R spec --check-leaks

最佳答案

我们通过将 eventually.throw() 替换为 chai-as-promised 提供的 .be.rejected 来解决这个问题,因为 async 函数 总是返回一个 Promise。起初我并不清楚这一点。查看关于 github 的讨论如果你愿意。

关于javascript - 如何使用 mocha/chai/chai-as-promised 测试 ES7 异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29334775/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com