2015-03-29 2 views
4

У меня есть следующие функции для теста:Как проверить функцию 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 
+0

Взгляните на мой код на https://stackoverflow.com/questions/33369389/how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koaa -js-app, может быть, это может вам помочь? – egeland

ответ

3

Мы решили эту проблему, заменив eventually.throw() с .be.rejected предоставленной Chai-а обещанного, так как async function всегда возвращает Promise. Это было непонятно мне в первую очередь. Взгляните на обсуждение на github, если хотите.

0

Хотя ваша ситуация кажется уникальной для любого, кто мог бы прийти с «подобными» ситуациями

Насколько я знаю, вы можете протестировать любой асинхронный фрагмент кода с «сделано»

«Тестирование асинхронного код с Mocha не может быть проще! Просто вызовите функцию обратного вызова, когда ваш тест завершен. добавляя обратного вызова (обычно с именем Done) к нему() Mocha будет знать, что он должен ждать завершения. " https://mochajs.org/

describe('User', function() { 
    describe('#save()', function() { 
    it('should save without error', function(done) { 
     var user = new User('Luna'); 
     user.save(function(err, result) { 
     if (err) throw err; 
     done(); 
     }); 
    }); 
    }); 
}); 
Смежные вопросы