Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将nock与Intern4和dojo一起使用-正确的方法是什么_Node.js_Ajax_Dojo_Intern_Nock - Fatal编程技术网

Node.js 将nock与Intern4和dojo一起使用-正确的方法是什么

Node.js 将nock与Intern4和dojo一起使用-正确的方法是什么,node.js,ajax,dojo,intern,nock,Node.js,Ajax,Dojo,Intern,Nock,我一直在用Intern作为我们的代码库的测试平台,它有很多奇怪之处。我们基本上在dojoLoader和核心dojo文件之外加载。这意味着我们在发布过程之外,在测试它所带来的好处方面失去了一切 我承担了开发工具链的任务,该工具链将管理代码(linting、build)并最终进行测试。我已经掌握了单元测试和功能测试的大部分方面,但是测试第三方API真的让我抓狂 在阅读文档时,我应该能够使用Nock来模拟api,我尝试了许多不同的示例,以获得一个基本的helloworld工作,并取得了不同程度的成功

我一直在用Intern作为我们的代码库的测试平台,它有很多奇怪之处。我们基本上在dojoLoader和核心dojo文件之外加载。这意味着我们在发布过程之外,在测试它所带来的好处方面失去了一切

我承担了开发工具链的任务,该工具链将管理代码(linting、build)并最终进行测试。我已经掌握了单元测试和功能测试的大部分方面,但是测试第三方API真的让我抓狂

在阅读文档时,我应该能够使用Nock来模拟api,我尝试了许多不同的示例,以获得一个基本的
helloworld
工作,并取得了不同程度的成功

我注意到的是,当您以本机方式使用node时,Nock似乎发挥得很好,但一旦将dojo引入到等式中,它就会崩溃。我尝试过使用
axios
get
,使用
tdd
bdd
。所有这些似乎都失败得很惨

下面的代码使我有了突破性的进展,这将使我能够成功地用Nock测试一个模拟API

我见过其他示例采用
TDD
方法来实现这一点,但当我使用
define
模式时,没有
done()
来表示异步过程已完成

虽然下面的内容确实有效,但我觉得我必须克服很多困难才能做到这一点,即缺少核心节点模块
util.promisify
(我目前使用的是
节点V9.10.x
)。缺乏对导入等的支持,这使得采用示例非常困难

我是新来实习的,我想知道是否有一个首选的或标准的方法,我错过了,这将使这更简单。老实说,我更喜欢视觉上的
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"
}

如果您使用的是dojo的请求方法,那么就可以使用dojo的to,在使用dojo时,to比nock更容易处理。不过,总的来说,这个过程将类似于您的示例中的过程:模拟请求、发出请求、在请求完成并做出断言时异步解析测试

关于节点v8+中存在的
util.promisify
,因此您应该能够在9.10中使用它

关于tdd和bdd,假设您指的是Intern测试接口(尽管听起来您可能指的是其他接口?),它们都支持相同的特性集。如果您可以使用“对象”接口(
registerSuite
),那么您也可以使用“tdd”(
suite
test
)和“bdd”(
description
it
)接口

关于缺少对
import
和其他语言功能的支持,这取决于测试的编写方式,而不是Intern的功能。如果测试需要在Dojo加载程序中运行,那么它们将需要是AMD模块,这意味着没有
import
。然而,测试可以用现代ES6编写,通过TypeScript编译器或babel运行,并作为AMD模块发出。这增加了一个构建步骤,但至少可以用更现代的语法编写测试


请注意,浏览器中没有特定于节点的功能(nock、promisify等)。

您的第一个假设是正确的,我指的是测试接口。不幸的是,我现在还不能使用TypeScript,所以有些东西我现在还可以接受。我和诺克的关系更进一步了。我可能会重新访问其他测试接口,看看出了什么问题。