我正在尝试为我的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
的文件? (我知道我可以使用RequireJS执行此操作,但我不想添加更多依赖项和框架)
我认为这是js
单元测试的一般性问题(不仅仅是QUnit)。
答案 0 :(得分:1)
两个选项:(a)模拟外部依赖项或(b)实际包含外部依赖项JS文件。对于第二个选项(b),我会使用像Karma和hook up QUnit这样的测试运行器。该链接网站上的配置非常简单。
然而,第一个选项(a)是我推荐的。它使您的测试更具幂等性,从而松散耦合。在QUnit中,你可以设置一个非常简单的模拟,我们只需使用一个简单的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