RequireJS и безголовая разработка на основе тестов


Я собираюсь использовать RequireJS для моего следующего большого проекта JS, однако мне трудно понять, как протестировать его в среде безголового тестирования. Я новичок как в RequireJS, так и в тестовом подходе к кодированию, поэтому все, что является дружественным к noob, было бы здорово.

2 10

2 ответа:

Хорошо, вот мои мысли. Вы должны писать тесты только для вашего собственного кода, а не для кода сторонних разработчиков, поэтому нет необходимости тестировать RequireJS, так как библиотека работает правильно. (У них есть свои собственные тесты, которым вы должны доверять.)

Таким образом, вы должны быть в состоянии предположить, в ваших тестах, что RequireJS работает. Точно так же, как вы предполагаете, что parseInt работает, и setTimeout работает, и Math.min работает: у разработчиков этих тестов есть свои собственные тесты, и вам не нужно писать больше.

Если это не работает (весьма маловероятно), или если вы используете его неправильно (незначительно более вероятно), то ваш тест должен катастрофически провалиться: вы в конечном итоге вызовете методы для объектов, которые не существуют, например.

Имея это в виду, вы должны модульно протестировать свои индивидуальные модули RequireJS. Для этого либо каждое тестовое приспособление должно быть заключено в модуль, который requireявляется его тестируемым модулем системы, либо тесты должны быть асинхронными, и в качестве их части они должны require тестируемый модуль системы. Опять же, просто предположим, что вы получили правильный модуль обратно: если вы этого не сделали, то есть если вы злоупотребляете RequireJS, тесты катастрофически провалятся.

Вы можете протестировать модули RequireJS из командной строки , используя r.js для запуска сценариев в узле.

Затем вы можете использовать модули узлов, такие какassert , чтобы создать набор тестов для себя.

Вот слишком простой пример:

scripts/simple.js:

define({ name: 'Really simple module' });

tests/test_simple.js:

require({ baseUrl: 'scripts' }, ['assert', 'simple'], function(assert, simple) {

    var test = function(callback) {
        var msg;
        try {
            callback();
        } catch (e) {
            msg = 'Failed: expected "' + e.expected + 
                  '" but got "' + e.actual + '" instead.';
        }
        if (!msg) {
            msg = 'Passed';
        }
        console.log(msg);
    };

    // This will pass
    test(function() {
        assert.equal(simple.name, 'Really simple module');
    });

    // This will fail
    test(function() {
        assert.equal(simple.name, 'Foo');
    });

});

Затем вы можете запустить тест из каталога верхнего уровня вашего проекта:

node path/to/r.js test/test_simple.js
И вы, вероятно, могли бы сделать лучше, чем это. Модуль assert-это просто голые кости. это нужно для того, чтобы сделать себе тестовый набор. Если вы не хотите запускать свой собственный, Вы можете попробовать использовать пакет, подобный CommonJS Test Runner, но сначала обязательно прочитайте документацию r.js.