У меня есть следующие функции для теста:Как проверить функцию ES7 асинхронной используя мокко/Chai/Chai-а обещанный
// ...
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, chai и chai-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
комментарий в коде выше, чтобы получить контекст, я имею в виду.
Так что случается, что тест (ы) не дождался завершения функции async password()
. Когда я узнал, что функции async ECMAScript7 немедленно возвращают thenable, так что это должно быть хорошо, поскольку chai-as-обещанный использует именно эту функцию. Я предполагаю, что асинхронные функции не вносят ошибок в это обещание, а не бросают его в закрывающую функцию, не имея возможности захватить ее через expect()
.
Для нетерпеливых людей: Я transpile этот код на лету с babel с помощью следующей команды:
babel-node --experimental node_modules/mocha/bin/_mocha --watch --recursive -R spec --check-leaks
Обновление для Бабеля 6:
Использование Бабель-узла 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
Взгляните на мой код на https://stackoverflow.com/questions/33369389/how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koaa -js-app, может быть, это может вам помочь? – egeland