Как сделать пустые тесты-заполнители намеренно неудачными в 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();
    });
});