首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mocha/chai/chai承诺测试ES7异步函数

如何使用mocha/chai/chai承诺测试ES7异步函数
EN

Stack Overflow用户
提问于 2015-03-29 21:00:15
回答 1查看 3.6K关注 0票数 5

我有以下功能要测试:

代码语言:javascript
复制
// ...
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));
  }

  // ...

}

现在,我想用摩卡咖啡印度茶柴应生来测试这个函数:

代码语言:javascript
复制
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异步函数会立即返回一个可处理的函数,所以它应该是可以的,因为chai承诺使用这个特性。我的猜测是,异步函数不会向上述承诺中抛出错误,而不会将其抛到封闭函数本身中,无法通过expect()捕获它。

对于急切的人们:我使用以下命令动态地使用巴贝尔传递这段代码:

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

更新Babel 6:

使用babel-node 6.4.0,可以使用以下方法:

代码语言:javascript
复制
npm install --save-dev babel-preset-stage-0

然后跑:

代码语言:javascript
复制
./node_modules/.bin/babel-node --presets stage-0 node_modules/mocha/bin/_mocha --    
recursive -R spec --check-leaks
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-05 11:30:21

我们解决了这个问题,将eventually.throw()替换为chai承诺提供的.be.rejected,因为async function总是返回承诺。我一开始还不清楚。如果您愿意的话,请看一下关于github的讨论。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29334775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档