代码之家  ›  专栏  ›  技术社区  ›  ChrisV

如何使用磁带和测试设置JavaScript github测试工具

  •  1
  • ChrisV  · 技术社区  · 12 年前

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

    似乎磁带和测试应该做我想做的事情(最小的轻量级解决方案,带有漂亮的github徽章),除非有人有其他解决方案,但我在如何设置问题上举步维艰。

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

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

    我目前拥有的是:

    myobj.js:

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

    myobj-js:

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

    当然,这些通常会使用

    <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)。

    谢谢。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Wladimir Palant    12 年前

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

    1. 安装Node.js(这也将安装 npm 命令行工具)。这里的方法是特定于发行版的,在基于Debian的Linux发行版上,您可以这样做:
      sudo apt-get install nodejs
      
    2. 设置项目的目录结构:
      myproject/
      |- package.json
      |- myobj.js
      |- myobj-sub.js
      |- test/
          |- myobj.js
      
      您可以指定 lots of different parameters 在里面 package.json 然而,唯一重要的部分是 devDependencies 确保测试线束已安装:
      {
        "name": "myproj",
        "version": "1.0.0",
        "description": "Just some test project",
        "devDependencies": {
          "tape" : "~2.13.3"
        },
        "scripts": {
          "test": "node test/*.js"
        }
      }
      
    3. 安装依赖项。现在它们已在中指定 包.json 这只是从项目目录运行的问题:
      npm install
      
      这将下载所有依赖项并将其放入 node_modules 项目目录中的子目录。
    4. 运行测试:
      npm run-script test
      

    就这样,测试正在进行。唯一的问题是它们失败了,因为脚本文件不使用 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 为此。安装浏览器:

    sudo npm install -g browserify
    

    运行它生成一个包:

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

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

        2
  •  2
  •   ChrisV    12 年前

    多亏了@wladimir和一些实验,我发现我可以安排事情,这样我就可以用标准函数表达式来构造代码,这样它在浏览器中正常运行,也可以在node.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-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”包含原始脚本:

    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(),但那是另一回事。

    推荐文章