包括用于单元测试的外部 .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