如何使用Jasmine在window对象上单元测试Object.defineProperty?

时间:2013-12-18 12:15:29

标签: javascript unit-testing mocking jasmine

假设我在script.js中有以下(简化的)JavaScript代码

(function() {
  var _val;
  Object.defineProperty(window, "myCallback", {

    // ...

    set: function(val) {
      _val = val;
      setTimeout(_val, 0);
    }
  });
})();

现在我正在尝试创建一个声明断言传递的val回调被调用的规范。

以下(简化)scriptSpec.js:

describe("setter", function() {

  var spy = jasmine.createSpy('callback');

  it("should call passed callback", function() {
     window.myCallback = spy;
     expect(spy).toHaveBeenCalled();
  });
});

这个规范有一个问题,因为它没有在window对象上注册我的属性,因此,调用

window.myCallback
在我的测试中,不会调用setter。

有没有合理的方法用Jasmine测试这些东西?

2 个答案:

答案 0 :(得分:0)

看起来像一个简单的错误。你没有在你的测试用例中使用你的间谍。

describe("setter", function () {
    var spy = jasmine.createSpy("callback");  // "callback" is just the internal name

    it("should call passed callback", function () {
        window.myCallback = spy;  // <--- Use the actual spy object here
        expect(spy).toHaveBeenCalled();
    });
});

答案 1 :(得分:0)

问题是在 setTimeout()函数调用中设置_ val 变量。然后在 setTimeout()成功完成工作之前调用Jasmine的预期。

我可以使用Jasmine的运行/等待功能来验证setter行为。

it("should call passed callback", function() {
    var spy = jasmine.createSpy('callback');
    runs(function () { window.myCallback = spy; });
    waits(10);
    runs(function () { expect(spy).toHaveBeenCalled(); });
});