Идиоматическое тестирование, когда.js обещает с Жасмин
Я пишу несколько тестов Jasmine для кода, который возвращает when.js
обещания. Я постоянно нахожу, что пишу такой код:
doMyThing().then(function(x) {
expect(x).toEqual(42);
done();
}).otherwise(function() {
expect(true).toBe(false);
done();
});
Единственный способ поймать исключение с помощью otherwise()
функция (это более старая версия when.js), а затем, кажется, нет функции Jasmine (2.0), чтобы сказать "обнаружен сбой" - отсюда и клудж "expect(true).toBe(false)
".
Есть ли более идиоматический способ сделать это?
2 ответа
После более внимательного изучения документации и понимания того, что мы используем Jasmine 2.3, я вижу, что мы можем использовать fail()
функция, которая значительно упрощает вещи. Пример в вопросе становится:
doMyThing().then(function(x) {
expect(x).toEqual(42);
}).otherwise(fail).then(done);
Если doMyThing()
выдает исключение, что Ошибка передается fail()
который печатает трассировку стека.
это .otherwise(fail).then(done);
оказывается довольно удобной идиомой.
Вам следует подумать о тестирующей библиотеке с поддержкой обещаний, такой как Mocha, или с использованием помощника, такого как jasmine-as-обещал, который дает вам этот синтаксис. Это позволит вам сделать что-то вроде:
// notice the return, and _not_ passing `done` as an argument to `it`:
return doMyThing().then(function(x) {
expect(x).toEqual(42);
});
По сути, возвращаемое значение проверяется как обещание, и, если это тестовая среда, проверяет, отклонено ли обещание, и обрабатывает ли это как сбой.