Как сделать пустые тесты-заполнители намеренно неудачными в Mocha?
Я пишу API в NodeJS и тестирую с помощью Mocha, Chai и SuperTest. Я использую типичный подход, основанный на тестах, для написания тестов, а затем для тестирования этих тестов с рабочим кодом. Однако из-за количества тестов для всех разных перестановок я начал писать пустые тесты-заполнители, чтобы иметь все описания it('should...')
, чтобы напомнить мне, что тестировать, когда я доберусь до этой функции. Например:
it 'should not retrieve documents without an authorized user', (done) ->
done()
Проблема заключается в том, что done()
вызывается без какого-либо утверждения, поэтому тест считается передачей, поэтому я добавил следующее утверждение.
false.should.equal true # force failure
но это хак и причина сбоя, что Mocha-дисплеи могут показаться запутанными, особенно когда другие полные тесты могут быть неудачными.
Есть ли какой-либо официальный способ преднамеренно пропустить тесты-заполнители, подобные этому в Mocha?
Ответы
Ответ 1
Официальным способом отмечать тесты как еще не готовые к тестированию является использование skip
, который является методом, который отображается как поле describe
и it
. Вот пример:
describe("not skipped", function () {
it("bar", function () {
throw new Error("fail");
});
it.skip("blah", function () {
throw new Error("fail");
});
});
describe.skip("skipped", function () {
it("something", function () {
throw new Error("fail");
});
});
Вышеприведенный код, помещенный в файл test.js
и запускаемый с $ mocha --reporter=spec test.js
, создает:
not skipped
1) bar
- blah
skipped
- something
0 passing (4ms)
2 pending
1 failing
1) not skipped bar:
Error: fail
at Context.<anonymous> (/tmp/t33/test.js:3:15)
at callFn (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:223:21)
at Test.Runnable.run (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:216:7)
at Runner.runTest (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:374:10)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:452:12
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:299:14)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:309:7
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:247:23)
at Object._onImmediate (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:276:5)
at processImmediate [as _immediateCallback] (timers.js:354:15)
Имена тестов, которым предшествует -
, пропускаются. Кроме того, в терминале, поддерживающем цвета, пропущенные тесты отображаются синим цветом (против красного цвета для неудачных тестов и зеленым для прохождения). Пропущенный тест считается "ожидающим", поэтому Mocha сообщает количество пропущенных тестов как "2 ожидающих".
Ответ 2
Не реализованный тест не должен fail
, он должен быть помечен как pending
.
Краткий метод маркировки теста мокки как not yet implemented
заключается в том, чтобы не передавать функцию обратного вызова обработчику it
.
describe("Traverse", function(){
describe("calls the visitor function", function(){
it("at every element inside an array")
it("at every level of a tree")
})
})
Запуск mocha test
покажет ваши незавершенные тесты как ожидающие.
$ mocha test
Traverse
calls the visitor function
- at every element inside an array
- at every level of a tree
0 passing (13ms)
2 pending
Ответ 3
Если вы передадите строку или ошибку в done()
, она сообщит об этом как ошибку. Итак:
it 'should not retrieve documents without an authorized user', (done) ->
done('not implemented')
приведет к сбою теста с выходом:
done(), вызываемый с ошибкой: не реализован
Мне нравится решение @Canyon просто не передавать обратный вызов, чтобы пометить тесты "ожидающие", но в моем случае я хочу, чтобы эти заполнители не смогли выполнить мои CI-сборки, поэтому сделать их фактическими неудачными тестами, как это было проще.
Ответ 4
Это действительно хороший вопрос, потому что я также считаю, что это супер полезно. Посмотрев на это, я подумал бы просто создать собственную функцию "todo" или "fail" для вашей оболочки, которую вы можете использовать в своей кодовой базе.
В приведенных ниже примерах используется функция todo, которая выведет текст "еще не реализованный". Это может быть полезно как отдельный модуль, даже если вы можете импортировать и использовать все ваши тесты. Может потребоваться немного изменить код...
Пример в chai assert
var assert = require('chai').assert;
function todo() {
assert(false, "method not yet implemented");
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});
Пример использования chai assert, с параметром fail (хотя он выглядит излишним)
var assert = require('chai').assert;
function todo() {
assert.fail(true, true, "method not yet implemented"); //1st 2 args can be anything really
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});