Вопрос

Попытка встать на скорость с node.js и nodeunit, но я нахожу проблему с NodeUnit, где он не видит призыв test.done() в одном из тестов.

Код:

// Added for clarity.
var client = require("restify").createJsonClient({
    "version": "*",
    "url": "http://localhost:" + server.Port
});

exports["tests"] = {
    "setUp": function (callback) {
        server.StartServer();
        callback();
    },
    "tearDown": function (callback) {
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },

    // Note: I expect this test to fail as it is a copy of the above
    //       test on a different url that doesn't return the ImATeapot
    //       HTTP error. But it doesn't look like it's detecting it
    //       properly.

    "TakeThisInfo": function (test) {
        test.expect(4);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    }
};

Выход:

FAILURES: Undone tests (or their setups/teardowns):
- tests - TakeThisInfo

To fix this, make sure all tests call test.done()

Я надеюсь, что это что -то глупое.

Версии:-

Node: 0.10.21
NPM: 1.3.11
Nodeunit: 0.8.2
Grunt-CLI: 0.1.10
Grunt: 0.4.1
Это было полезно?

Решение

Во -первых, я не знаю, что находится в вашем коде, но я ожидаю, что он будет асинхронным, поэтому иметь что -то большее в вашей функции настройки:

function (callback) {
  server.StartServer(function(){
    callback();
  });
}

Во -вторых, продолжайте присутствовать, что нодеунит выполняет запуск и функции разрыва после и перед каждым тестом Поэтому я подозреваю, что вы запускаете свой сервер 2 раза (как и в разрыве, вы на самом деле не закрываете).

Другие советы

Последние пару часов я потратил на эту проблему, и что стало ясным, так это то, что NodeUnit не имеет возможности ловить и отображать исключения, добавленные в функции, которые позднее вызваны процессом типа io или settimeout. Учитывая, как работает JavaScript, это неудивительно. Все работает, как только вы уверены, что нет исключений, но если у вас есть ошибка в вашем коде, вы получите сообщение «Отсутствие тестов» и ничего больше. Вот что я сделал, чтобы решить свои проблемы (в качестве примера используя маршрут Restify):

function myRoute(req, res, next) {
    try {
        // your code goes here...
    }
    catch (err) {
        // write it to the console (for unit testing)
        console.log(err);
        // pass the error to the next function.
        next(err);
    }
}

Как только я понял проблему таким образом, исправить ее, потому что гораздо более ясен, и я смог пройти все свои тесты!

Я подозреваю, что ты на самом деле не звонишь test.done() В этом втором тесте. Положить console.log() Позвоните туда, чтобы убедиться, что вы на самом деле делаете этот звонок.

FWIW, я воспроизвел описанную проблему, используя упрощенную версию вашего теста, ниже. Если вы опустите on('error', function() {...}) Хэндлер, затем 2 -й тест не завершится. Таким образом, моя теория состоит в том, что ваша /push Конечная точка запускает другое поведение в модуле Restify. Т.е. ты Конечно Restify вызывает ваш обратный вызов err Собственность там, или она делает что -то другое? ... как, например, излучение такого события, как http.get делает, ниже.

var http = require('http');

exports.test1 = function (test) {
  test.expect(1);
  http.get({hostname: "www.broofa.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  });
};

exports.test2 = function (test) {
  test.expect(1);
  http.get({hostname: "www.no-such-domain.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  }).on('error', function() {
    // Comment line below out to repro the "Undone tests" error
    test.done();
  });
};

Я работаю вокруг него, втягивая сервер в собственный процесс в настройке, а затем убивая его в разрыве. Подумайте, проблема заключалась в том, что сервер создается, а не выключение. Спасибо @matteofigus за это.

var cp = null; // child process
exports["tests"] = {
    "setUp": function (callback) {
        cp = fork("./lib/server.js", {"silent": true});
        callback();
    },
    "tearDown": function (callback) {
        cp.kill("SIGHUP");
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },
    "TakeThisInfo": function (test) {
        test.expect(1);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.ok(false);
            test.done();
        });
    }
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top