Использование 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 и т. Д.) Не будет работать в браузере.