【问题标题】:Jasmine calls.length and callCount are undefinedJasmine calls.length 和 callCount 未定义
【发布时间】:2025-12-23 15:10:15
【问题描述】:

我正在尝试使用 Jasmine 测试我的 chrome 扩展程序,但我无法让 calls.lengthcallCount 按预期运行。两种情况都返回undefined

我已包含代码示例和规范。如果有帮助,下面是其余代码:https://github.com/DruRly/kamikaze/tree/closeIdleTab

如何重现:

  • git clone https://github.com/DruRly/kamikaze/tree/closeIdleTab
  • cd kamikaze
  • open SpecRunner.html

spec/kamikazeSpec.js

describe("kamikaze", function() {
  describe("closeIdleTabs", function(){
    it("calls closeIdleTab for each tab received", function(){
      spyOn(kamikaze, 'closeIdleTab');

      kamikaze.closeIdleTabs([1,2,3]);
      expect(kamikaze.closeIdleTab.calls.length).toBe(3);
    })
  })
})

src/kamikaze.js

kamikaze = {
  ...

  closeIdleTabs: function(tabs){
    tabs.forEach(function(tab){
      test.closeIdleTab(tab);
    })
  },

  closeIdleTab: function(tab){
    if(tabTimeStamps[tab.id]){
      var secondsSinceUpdated = getSecondsSinceUpdated(tab.id)
      if(secondsSinceUpdated > (minutesUntilIdle * 60)){
        chrome.tabs.remove(tab.id)
      }
    }
  },

  ...
}

【问题讨论】:

  • 问题的质量和格式+10。大多数人会在前两行(字面意思)之后停下来! (相关代码、完整代码链接和重现问题的步骤 - 我讨厌回答这个问题很容易:))
  • 感谢@ExpertSystem!感觉自己快疯了。我仍然可能是,但我也在查看过时的文档:)
  • 如果回购仍然可供参考,那就太好了。

标签: javascript google-chrome-extension jasmine bdd jasmine2.0


【解决方案1】:

Jasmine API 在 2.x 版本“系列”中发生了一些变化。
根据 latest docs 你应该使用count() 方法:

expect(kamikaze.closeIdleTab.calls.count()).toBe(3);

我也用你的代码试过了,所有测试都成功通过了。

【讨论】:

    【解决方案2】:

    替代语法(失败时输出更好一点)将是

    expect(kamikaze.closeIdleTab).toHaveBeenCalledTimes(3);
    

    【讨论】: