如何使用tape& amp设置JavaScript github测试工具testling

时间:2014-07-13 18:00:50

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

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

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

我从未使用过node.js,似乎磁带和testling(以及所有相关示例)都集中在node.js上。

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

我目前所拥有的是:

myobj.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上运行,如果它有任何区别的话)。

THX。

2 个答案:

答案 0 :(得分:3)

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

  1. 安装Node.js(这也将安装npm命令行工具)。这里的方法是特定于发行版的,在基于Debian的Linux发行版上你会做:
    sudo apt-get install nodejs
    
  2. 设置项目的目录结构:
    myproject/
    |- package.json
    |- myobj.js
    |- myobj-sub.js
    |- test/
        |- myobj.js
    
    您可以在package.json中指定lots of different parameters,但唯一重要的部分是devDependencies,以确保安装了测试工具:
    {
      "name": "myproj",
      "version": "1.0.0",
      "description": "Just some test project",
      "devDependencies": {
        "tape" : "~2.13.3"
      },
      "scripts": {
        "test": "node test/*.js"
      }
    }
    
  3. 安装依赖项。现在它们已在package.json中指定,这只是从项目目录运行的问题:
    npm install
    
    这将下载所有依赖项并将它们放入项目目录中的node_modules子目录中。
  4. 运行测试:
    npm run-script test
    
  5. 就是这样,测试正在运行。唯一的问题是它们失败了,因为您的脚本文件不使用CommonJS format。以下是myobj.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。安装browserify:

    sudo npm install -g browserify
    

    然后运行它来生成一个包:

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

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

答案 1 :(得分:2)

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

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

myobj.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;

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

然后可以使用&lt; script&gt;将这些JavaScript文件拖入HTML中。元素正常。

测试工具需要使用'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()有点挣扎,但这是另一个故事。