Jasmine:从窗口范围函数调用的测试方法

时间:2015-08-31 13:53:06

标签: javascript testing jasmine

我使用Jasmine来测试我的一些代码。看起来有点像这样

# main logic
function Analytics() {
  this.construct = function() {
  }

  this.foo = function() {
  }

  this.bar = function() {
  }
}

# "main" routine, called by jQuery on ready, or direct by Jasmine
function analytics() {
  new Analytics().construct();
}

# calls main routine
$(document).ready(function () {
  analytics();
});

在浏览器中运行时,它可以正常工作。但是,当我想用​​Jasmine测试我的代码时(如果在调用analytics()时调用构造函数,它就会失败。

Expected spy construct to have been called. (1)

这是规范的样子:

it('should call the constructor when the document is ready', function({
    var _analytics = new Analytics();
    spyOn(_analytics, 'construct')
    analytics();  # note this is the "main" routine
    expect(_analytics.construct).toHaveBeenCalled();
})

我的测试用例似乎不正确,但我真的不知道如何。有没有人对这种行为有解释?

1 个答案:

答案 0 :(得分:0)

正如我所看到的,来自代码" analytics" function创建了一个新的Analytics实例。

所以测试可能就是这样:

it('should call the constructor when the document is ready', function({
    var _analytics = new Analytics(); // --> create new instance of Analytics
    spyOn(_analytics, 'construct') // --> spy on construct func
    analytics();  // --> This, creates new instance
    // of analytics which you don't spy on.
    expect(_analytics.construct).toHaveBeenCalled();
});

尝试通过原型间谍:

spyOn(Analytics.prototype, 'construct'); // will spy all instances.

测试将如下所示:

it('should call the constructor when the document is ready', function({
    spyOn(Analytics.prototype, 'construct');
    analytics();
    expect(Analytics.prototype.construct).toHaveBeenCalled();
});

请注意,您无法访问在分析功能中创建的实例。

创建后您将无法使用它。

我不知道任务的背景。但也许你应该使用默认构造函数。

function Analytics(options) {
   // this is constructor
   this.prop1 = options.prop1;
   this.prop2 = options.prop2;

   this.foo = function() {

   }

   this.bar = function() {

   }
}

var analyticsModule = new Analytics(options);