如何使用NodeUnit测试客户端代码?

时间:2012-06-24 08:30:51

标签: javascript unit-testing node.js client-side

这是我之前question的后续内容。

假设我正在编写带有calculate.js函数的calculate源文件,以便在我的客户端代码中使用它

function calculate(num) {
    return num * 2;
}

现在我想测试一下。

我正在使用此article导出 nodeunit函数中所述的calculate(以便测试可以调用它)。

function calculate(num) {
    return num * 2;
}

exports.calculate = calculate // node.js stuff. won't run in a browser!

nodeunit测试运行正常但我不再使用calculate.js我的网络应用程序,因为它使用exports

现在它看起来像一个捕获。我可以解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

使用非节点js测试框架,如jasminebdd或jstestdriver

答案 1 :(得分:2)

Running tests in the browser

  

如果您希望为测试套件使用commonjs格式(使用   导出),由你来定义commonjs工具   浏览器。有许多替代品,它很重要   使用现有代码,这就是当前nodeunit不能使用的原因   开箱即用。

我认为你应该看看browserify来实现这个目标。

Browserify

  

使用服务器端构建在浏览器中使节点样式的require()工作   一步,好像通过魔法!

Mocha

  

Mocha是一个简单,灵活,有趣的node.js JavaScript测试框架   和浏览器。

我认为你应该看一下我非常喜欢的TJ(明确作者)创建的Mocha(比我过去使用的nodeunit更好)。使用mocha,您可以轻松地进行代码覆盖,观看模式,通知以及更好的Mocha维护。

答案 2 :(得分:2)

Karma runnernodeunit adapter在浏览器和Phantom JS中运行nodeunit测试。下面是一个示例test entrypointGruntfile使用browserify来运行用CommonJS modules(导出)编写的测试。

答案 3 :(得分:2)

如果您在nodeunit上设置,则

nodeunit-browser-tap + Testling是另一种选择。

  • testling npm package为您在本地浏览器中运行的测试提供命令行输出。
  • 如果您在Github上托管,
  • Testling.com可以让您免费跨浏览器CI。
  • 浏览器点击包装器可以获得Testling理解的nodeunit输出。

答案 4 :(得分:0)

您实际上可以在nodeunit本身内测试隔离的jquery逻辑。例如,这是我为datepicker libary写的一些测试

/*jshint evil:true */
/*global module, require, DatePair */

var fs = require('fs');
// Some of the plugins use jQuery var instead of $
var jQuery = require('jquery');
var $ = jQuery;

// Recreate window and document
var window = { jQuery: jQuery };
var document = window;

// file is included here:
eval(fs.readFileSync('../lib/js/jquery/plugins/jquery.cookie.js') + '');
eval(fs.readFileSync('../lib/js/jquery.timepicker/jquery.timepicker.js') + '');
eval(fs.readFileSync('../lib/js/bootstrap/bootstrap-datepicker.js') + '');
eval(fs.readFileSync('../homepage/js/datepair.js') + '');

// Initialize DatePair Object
var datePair = DatePair(new Date(), {
    dateStart: $('<input type="text" autocomplete="off">'),
    dateEnd: $('<input type="text" autocomplete="off">'),
    timeStart: $('<input type="text" autocomplete="off">'),
    timeEnd: $('<input type="text" autocomplete="off">')
});

module.exports = {
    'Time Delta Var Is 1 hour' : function (test) {
        test.equal(datePair.getTimeDelta(), 3600);
        test.done();
    },
    'Change Date And Check For 1 Hour Difference' : function (test) {
        datePair.startTime.val("10:00pm").change();
        test.equal(datePair.endTime.val(), "11:00pm");
        test.done();
    },
    'Make End Date Move Up One Day' : function (test) {
        var expectedEndDates = [1];
        datePair.startTime.val("11:00pm").change();
        expectedEndDates.push(parseInt(datePair.startDate.val().split("/")[1], 10) + 1);

        test.ok($.inArray(parseInt(datePair.endDate.val().split("/")[1], 10), expectedEndDates) !== -1);
        test.equal(datePair.endTime.val(), "12:00am");
        test.done();
    },
    'Change To 11:30pm Of Previous Day' : function (test) {
        //Move startTime 1 Day Forward
        datePair.startTime.val("11:00pm").change();
        //Move EndDate 1 Day Backwards
        datePair.endTime.val("11:30pm").change();

        test.equal(datePair.endDate.val(), datePair.startDate.val());
        test.done();
    }
}

在此处查看完整代码+库https://github.com/keithhackbarth/jquery-datetime-picker