Использование nock с Intern4 и dojo - Какой правильный подход

Я экспериментировал с Intern'ом как с платформой для тестирования нашей базы кода, которая имеет ряд странностей. Мы в основном загружаем за пределы dojoLoader и основных файлов dojo. Это означает, что мы находимся вне процесса выпуска и теряем все хорошее с точки зрения тестирования того, что это приносит.

Я взял на себя задачу разработки цепочки инструментов, которая будет управлять кодом (linting, build) и, наконец, тестирования. И я справился с большинством аспектов модульного тестирования и функциональных тестов, но тестирование сторонних API действительно заставило меня почесать голову.

Читая документы, я должен был использовать Nock, чтобы высмеивать API, я пробовал много разных примеров, чтобы получить основные hello world работаю, и у меня были разные степени успеха.

Что я отмечаю, так это то, что Nock, кажется, играет хорошо, когда вы нативно используете нод, но все это разваливается, когда додзё вводится в уравнение. Я пытался использовать axios, get, с tdd а также bdd, Все из которых, кажется, с треском провалились.

У меня был момент прорыва с приведенным ниже кодом, который позволит мне успешно протестировать макет API с Nock.

Я видел другие примеры, принимающие TDD подход к этому, но когда я использую define картина, нет done() чтобы показать, что асинхронный процесс завершен.

Хотя приведенное ниже работает, я чувствую, что мне пришлось перепрыгнуть через много обручей, чтобы добраться до этой точки, то есть отсутствие модуля основного узла util.promisify (В настоящее время я работаю с Node V9.10.x). Отсутствие поддержки для import и др., что делает принятие примеров очень сложным.

Я новичок в интернате, и мне интересно, есть ли предпочтительный или стандартный подход, который я пропускаю, который сделал бы это проще. Я честно предпочитаю TDD/BDD шаблон визуально, но если ниже мой единственный вариант для моей настройки, то я приму это.

define([
    'require',
    'dojo/node!nock',
    'dojo/node!http',
    'dojo/node!es6-promisify'
], function (require, nock, http, util) {
    const { registerSuite } = intern.getInterface('object');
    const { assert } = intern.getPlugin('chai');

    const { get } = http;
    const { promisify } = util;
    const _get = promisify(get);

    registerSuite('async demo', {
        'async test'() {
            const dfd = this.async();

            nock('http://some-made-up-service.com')
                .get('/request')
                .reply(200, {a:'Hello world!'});

            http.request({
                host:'some-made-up-service.com',
                path: '/request',
                port: 80
            }, function(res){
                res.on('data', dfd.callback((data) => {
                    var toJSON = JSON.parse(data.toString())
                    assert.strictEqual(toJSON.a, 'Hello world!');
                }))
            }).end();
        }
    });
});

Моя конфигурация здесь также, я уверен, что в файле есть записи, которые не нужны, но я просто выясняю, что работает в данный момент.

{
    "node": {
        "plugins": "node_modules/babel-register/lib/node.js"
    },
    "loader": {
        "script": "dojo",
        "options": {
            "packages": [
                { "name": "app", "location": "asset/js/app" },
                { "name": "tests", "location": "asset/js/tests" },
                { "name": "dojo", "location": "node_modules/dojo" },
                { "name": "dojox", "location": "node_modules/dojox" },
                { "name": "dijit", "location": "node_modules/dijit" }
            ],
            "map": {
                "plugin-babel": "node_modules/systemjs-plugin-babel/plugin-babel.js",
                "systemjs-babel-build": "node_modules/systemjs-plugin-babel/systemjs-babel-browser.js"
            },
            "transpiler": "plugin-babel"
        }
    },
    "filterErrorStack": false,
    "suites": [
        "./asset/js/common/sudo/tests/all.js"
    ],
    "environments": ["node", "chrome"],
    "coverage": "asset/js/common/sudo/dev/**/*.js"
}

1 ответ

Решение

Если вы используете методы запросов dojo, вы можете использовать реестр запросов Dojo для настройки mocking, с которым может быть немного легче справиться, чем с nock при работе с Dojo. В целом, тем не менее, процесс будет похож на то, что в вашем примере: макетируйте запрос, делайте запрос, асинхронно разрешайте тест, когда запрос завершен и утверждения сделаны.

относительно util.promisifyЭто присутствует в Node v8+, так что вы сможете использовать его в 9.10.

Что касается tdd vs bdd, предположим, что вы ссылаетесь на тестовые интерфейсы Intern (хотя может показаться, что вы имеете в виду что-то еще?), Все они поддерживают один и тот же набор функций. Если вы можете сделать что-то с интерфейсом "объект" (registerSuite), вы также можете сделать это с помощью "tdd" (suite а также test) и "bdd" (describe а также it) интерфейсы.

Что касается отсутствия поддержки import и другие языковые возможности, которые зависят от того, как написаны тесты, а не от функции интерна. Если тесты должны выполняться в загрузчике Dojo, они должны быть модулями AMD, что означает отсутствие import, Тем не менее, тесты могут быть написаны на современном ES6 и проходить через компилятор TypeScript или babel и генерироваться как модули AMD. Это добавляет этап сборки, но по крайней мере тесты могут быть написаны в более современном синтаксисе.

Обратите внимание, что никакая специфичная для узла функциональность (nock, promisify и т. Д.) Не будет работать в браузере.

Другие вопросы по тегам