包括用于单元测试的外部.js文件

时间:2017-05-16 11:24:55

标签: javascript jquery node.js tdd qunit

我正在尝试为我的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)。

1 个答案:

答案 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