包括用于单元测试的外部 .js 文件
Including external .js files for unit tests
我正在尝试 运行 我的 JavaScript 单元测试(用 QUnit [不是我的想法,遗留项目] 编写)的覆盖率测试,并通过命令行 运行 它们。
我面临的问题是对外部代码位的引用。
看下面的例子:
代码:
var DateHelper = function() {
return {
GetUtcDate: function (date) {
if (DateTypeChecker.Data["date"]) {
return new Date();
}
return date;
}
}
测试:
QUnit.test('GetUtcNow - compare UTC date', function(assert) {
var currentUtcDate = DateHelper.GetUtcNow();
var nowDate = new Date();
assert.equal(nowDate.getUTCFullYear() == currentUtcDate.getFullYear(), 'dates are the same');
});
这是一个检查两个日期的非常简单的测试,在浏览器中 运行 时效果很好,因为包含 DateTypeChecker
的外部 javascript 文件已加载到 HEAD 中。
但是此测试在命令行中失败,因为 node
(或 w/e 正在执行测试)没有对 DateTypeChecker
对象的引用。
我的问题是,如何解决这个问题,以便 DateTypeChecker
的文件是 loaded/required? (我知道我可以用 RequireJS 做到这一点,但我不想添加更多的依赖项和框架)
我认为这是 js
单元测试(不仅仅是 QUnit)的一般问题。
两个选项:(a) 模拟外部依赖项或 (b) 实际包含外部依赖项 JS 文件。对于第二个选项 (b),我会使用像 Karma 和 hook up QUnit 这样的测试运行器。该链接站点上的配置非常简单。
不过,我会推荐第一个选项 (a)。它使您的测试更加幂等,从而松散耦合。在 QUnit 中你可以很容易地设置一个 mock,我们只需要使用一个简单的 beforeEach 函数:
QUnit.module( "testing DateHelper", {
beforeEach: function() {
// before each test runs, we can create a "fake" DateTypeChecker
// Note that it doesn't matter what this thing does, so long as it
// satisfies your dependency in the DateHelper
window.DateTypeCheker = {
Data: { date: true }
};
}
});
QUnit.test( ... ); // your normal stuff
我正在尝试 运行 我的 JavaScript 单元测试(用 QUnit [不是我的想法,遗留项目] 编写)的覆盖率测试,并通过命令行 运行 它们。 我面临的问题是对外部代码位的引用。 看下面的例子:
代码:
var DateHelper = function() {
return {
GetUtcDate: function (date) {
if (DateTypeChecker.Data["date"]) {
return new Date();
}
return date;
}
}
测试:
QUnit.test('GetUtcNow - compare UTC date', function(assert) {
var currentUtcDate = DateHelper.GetUtcNow();
var nowDate = new Date();
assert.equal(nowDate.getUTCFullYear() == currentUtcDate.getFullYear(), 'dates are the same');
});
这是一个检查两个日期的非常简单的测试,在浏览器中 运行 时效果很好,因为包含 DateTypeChecker
的外部 javascript 文件已加载到 HEAD 中。
但是此测试在命令行中失败,因为 node
(或 w/e 正在执行测试)没有对 DateTypeChecker
对象的引用。
我的问题是,如何解决这个问题,以便 DateTypeChecker
的文件是 loaded/required? (我知道我可以用 RequireJS 做到这一点,但我不想添加更多的依赖项和框架)
我认为这是 js
单元测试(不仅仅是 QUnit)的一般问题。
两个选项:(a) 模拟外部依赖项或 (b) 实际包含外部依赖项 JS 文件。对于第二个选项 (b),我会使用像 Karma 和 hook up QUnit 这样的测试运行器。该链接站点上的配置非常简单。
不过,我会推荐第一个选项 (a)。它使您的测试更加幂等,从而松散耦合。在 QUnit 中你可以很容易地设置一个 mock,我们只需要使用一个简单的 beforeEach 函数:
QUnit.module( "testing DateHelper", {
beforeEach: function() {
// before each test runs, we can create a "fake" DateTypeChecker
// Note that it doesn't matter what this thing does, so long as it
// satisfies your dependency in the DateHelper
window.DateTypeCheker = {
Data: { date: true }
};
}
});
QUnit.test( ... ); // your normal stuff