4

这是我之前的问题的后续。

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

函数计算(数){
    返回数 * 2;
}

现在我想测试一下。

nodeunit按照本文中的描述使用并导出calculate函数(以便测试可以调用它)。

函数计算(数){
    返回数 * 2;
}

export.calculate = 计算 // Node.js 的东西。它不会在浏览器中运行!

测试nodeunit运行正常,但我无法再calculate.js在我的 Web 应用程序中使用,因为它使用exports.

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

4

5 回答 5

3

使用非 Node.js 测试框架,如 jasminebdd 或 jstestdriver。

于 2012-06-24T08:44:15.200 回答
2

在浏览器中运行测试

如果您希望为您的测试套件使用 CommonJS 格式(使用导出),您可以为浏览器定义 CommonJS 工具。有许多替代方案,其重要的是它适合您现有的代码,这就是为什么 nodeunit 目前不提供开箱即用的功能。

我认为你应该看看 Browserify 来完成这个。

浏览器化

使用服务器端构建步骤使 Node.js 样式的 require() 在浏览器中工作,就像变魔术一样!

摩卡

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

我认为您应该看看我非常喜欢的由 TJ(Express.js 的作者)创建的 Mocha(比我过去使用的 nodeunit 更好)。使用 Mocha,您可以轻松地进行代码覆盖、监视模式、通知,并且 Mocha 更易于维护。

于 2012-06-25T15:05:21.243 回答
2

Karma runner有一个nodeunit 适配器,可以在浏览器和 PhantomJS 中运行 nodeunit 测试。这是一个示例测试入口点和Gruntfile使用Browserify来运行用CommonJS 模块(导出)编写的测试。

于 2013-04-06T05:18:32.507 回答
2

如果您在 nodeunit 上设置,nodeunit-browser-tap + Testling是另一个选项。

于 2013-04-26T10:22:53.947 回答
0

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

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

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

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

// The 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

于 2014-08-29T18:57:32.307 回答