【问题标题】:How to set up JavaScript github test harness using tape & testling如何使用磁带和测试设置 JavaScript github 测试工具
【发布时间】:2015-09-04 00:50:31
【问题描述】:

我在 github 上有一个 (JavaScript) 存储库,我想为其设置一个测试工具。

似乎“磁带”和“测试”应该做我想要的(带有漂亮 github 徽章的最小轻量级解决方案),除非有人有替代解决方案,但我正在努力解决如何设置。

我从未使用过 node.js,而且似乎磁带和测试(以及所有相关示例)都专注于 node.js。

谁能建议一个简单的客户端 JavaScript 库测试工具的最小配置?我猜(?)我需要 nodejs、npm、package.json 等在本地运行磁带/测试,但我不清楚如何将我的(非节点)JavaScript 合并到测试工具中。

我目前拥有的大致如下:

我的obj.js:

var MyObj = {};
MyObj.a = function() { return 'a'; }
MyObj.b = function() { return 'b'; }

myobj-sub.js:

MyObj.Sub = {};
MyObj.Sub.x = function() { return 'x'; }
MyObj.Sub.y = function() { return 'y'; }

这些当然通常会被拉入 HTML 使用

<script src="myobj.js"></script>
<script src="myobj-sub.js"></script>

对于测试工具,我想我需要类似的东西:

var test = require('tape');
test('myobj', function(assert) {
    assert.equal('a', MyObj.a(), 'test a');
    assert.equal('x', MyObj.Sub.x(), 'test x');
    assert.end();
});

但我不知道在哪里填补空白!

(ps:我在 Linux 上运行,如果有什么不同的话)。

谢谢。

【问题讨论】:

    标签: javascript unit-testing github node.js-tape


    【解决方案1】:

    您的问题没有太多空白。你需要做什么:

    1. 安装 Node.js(这也将安装 npm 命令行工具)。这里的方法是特定于发行版的,在基于 Debian 的 Linux 发行版上,您可以这样做: sudo apt-get install nodejs
    2. 为您的项目设置目录结构: 我的项目/ |- 包.json |- myobj.js |- myobj-sub.js |- 测试/ |- myobj.js 您可以在package.json 中指定lots of different parameters,但唯一重要的部分是devDependencies,以确保安装了测试工具: { “名称”:“我的项目”, “版本”:“1.0.0”, "description": "只是一些测试项目", “开发依赖”:{ “磁带”:“~2.13.3” }, “脚本”:{ “测试”:“节点测试/*.js” } }
    3. 安装依赖项。现在它们在package.json 中指定,这只是从项目目录运行的问题: npm 安装 这会下载所有依赖项并将它们放入项目目录中的 node_modules 子目录中。
    4. 运行测试: npm 运行脚本测试

    就是这样,测试正在运行。唯一的问题是它们失败了,因为您的脚本文件不使用CommonJS formatmyobj.js 应该是这样的:

    exports.a = function() { return 'a'; }
    exports.b = function() { return 'b'; }
    

    这里是myobj-sub.js:

    exports.x = function() { return 'x'; }
    exports.y = function() { return 'y'; }
    

    最后是test/myobj.js:

    var test = require('tape');
    var MyObj = require('../myobj');
    MyObj.Sub = require('../myobj-sub');
    test('myobj', function(assert) {
        assert.equal('a', MyObj.a(), 'test a');
        assert.equal('x', MyObj.Sub.x(), 'test x');
        assert.end();
    });
    

    如果你现在重新运行测试,它们就会成功。

    如果您想从网页中使用 CommonJS 模块怎么办?您可以为此使用browserify。安装浏览器:

    sudo npm install -g browserify
    

    并运行它来生成一个包:

    browserify myobj.js myobj-sub.js -o bundle.js
    

    bundle.js 现在是一个可以被网页包含的脚本文件 - 然后网页将能够像测试一样执行var MyObj = require('myobj');

    【讨论】:

    • 感谢您提供非常清晰的解释。那么,“磁带”测试将在 CommonJS 格式上运行,而不是在“标准”对象上运行,这是否正确?另外(我想这与使用 CommonJS 有关),MyObj.a 引用(私有方法)MyObj.c (什么是)如何?以及 MyObj.Sub.x 是如何引用 MyObj.a 的?
    • @ChrisV:Node.js 通常使用 CommonJS 表示法,它并不特定于 tape 模块。任何未导出的函数或变量都是“私有的”——它只能在模块内访问。 myobj-sub.js 可以像使用任何其他代码一样使用 myobj.js 的功能 - var MyObj = require("myobj");
    【解决方案2】:

    感谢@wladimir 和一些实验,我发现我可以安排一些事情,以便我可以使用标准函数表达式来构建我的代码,这样它就可以在浏览器中正常运行,也可以在 node.js 中运行。 js.

    我只需要将 module.exports 设置为已定义的对象,并将 MyObj.Sub 设置为 'require' MyObj,(均屏蔽为仅在 CommonJs / node.js 中可见),如下所示:

    我的obj.js:

    var MyObj = {};
    MyObj.a = function() { return 'a'; }
    MyObj.b = function() { return 'b'; }
    if (typeof module!='undefined' && module.exports) module.exports = MyObj;
    

    myobj-sub.js:

    if (typeof module!='undefined' && module.exports) var MyObj = require('./myobj.js');
    MyObj.Sub = {};
    MyObj.Sub.x = function() { return 'x'; }
    MyObj.Sub.y = function() { return 'y'; }
    if (typeof module!='undefined' && module.exports) module.exports = MyObj.Sub;
    

    (注意 './' 似乎对 require 很重要)。

    这些 JavaScript 文件然后可以像往常一样使用

    测试工具需要包含使用 'require' 的原始脚本:

    var test = require('tape');
    var MyObj = require('../myobj.js');
    MyObj.Sub = require('../myobj-sub.js');
    test('myobj', function(assert) {
        assert.equal(MyObj.a(), 'a', 'test a');
        assert.equal(MyObj.Sub.x(), 'x', 'test x');
        assert.end();
    });
    

    我在使用 btoa() / atob() 时遇到了一些困难,但那是另一回事了。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2017-01-17
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多