【问题标题】:Using nock with Intern4 and dojo - What is the correct approach将 nock 与 Intern4 和 dojo 一起使用 - 正确的方法是什么
【发布时间】:2023-04-06 16:09:01
【问题描述】:

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

我承担了开发一个工具链的任务,该工具链将管理代码(linting、build)并最终进行测试。而且我必须掌握单元测试和功能测试的大部分方面,但测试 3rd 方 API 确实让我摸不着头脑。

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

我要注意的是,当您在本地使用 node 时,Nock 似乎玩得很好,但是一旦将 dojo 带入等式,这一切都会崩溃。我尝试过使用axiosgettddbdd。所有这些似乎都失败了。

我在下面的代码中有一个突破性的时刻,这将使我能够成功地使用 Nock 测试一个模拟 API。

我看到其他示例采用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"
}

【问题讨论】:

    标签: node.js ajax dojo intern nock


    【解决方案1】:

    如果你使用dojo的request方法,可以使用Dojo的request registrysetup mocking,使用Dojo的时候处理起来比nock要容易一些。不过,总的来说,该过程将与您的示例中的类似:模拟请求、发出请求、在请求完成并做出断言时异步解析测试。

    关于util.promisify,它存在于 Node v8+ 中,因此您应该可以在 9.10 中使用它。

    关于 tdd 与 bdd,假设您指的是 Intern 测试接口(尽管听起来您可能指的是其他东西?),它们都支持相同的功能集。如果你可以用“object”接口(@98​​7654324@)做一些事情,你也可以用“tdd”(suitetest)和“bdd”(describeit)接口做.

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

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

    【讨论】:

    • 您的第一个假设是正确的,我指的是测试接口。不幸的是,我无法迁移到 TypeScript,所以我现在可以忍受一些东西。我对 Nock 有了更深入的了解。我可能会重新访问其他测试接口,看看出了什么问题。
    猜你喜欢
    • 2018-04-10
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 2020-09-29
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多