【问题标题】:Use jasmine spyOn with function使用带有功能的 jasmine spyOn
【发布时间】:2020-12-27 17:58:45
【问题描述】:

我需要用 jasmine (& karma) 编写单元测试用例,如下所示。它使用rollup 来编译它。

const A = () => {
 B();
}

const B = ()=> {
 console.log("B is called");
}

exports {A}

在这里我的test.js 文件中,当我们调用A() 时,我需要检查是否调用了B()。所以我尝试这样的事情。

import * as mainFunctions from 'main.js'

describe("" , function() {
  beforeEach(()=> {
    spyOn(mainFunctions, 'B');
    A();
  });

  it("", function() {
    expect(mainFunctions.B).toHaveBeenCalled();
  });
});

但是当我运行测试时,它给了我错误“错误: : B 未声明为可写或没有设置器”。请给我一个解决这个问题的方法。

【问题讨论】:

    标签: javascript node.js unit-testing jasmine


    【解决方案1】:

    B 对于所有意图和目的都是私有(它没有被导出),您应该直接测试私有方法。 p>

    你可以测试的是A的效果。我们expect,当A 被调用console.log 时会触发。所以你可以通过窥探console.log来测试效果。

    console.log 在这种情况下是一个模块依赖项。在编写单元测试时,您应该模拟(窥探)所有使用的依赖项并调用所有可用的公共方法。

    spyOn(console, 'log');
    
    ...
    
    it('should print log to console', function(){
      mainFunctions.A();
      expect(console.log).toHaveBeenCalled();
    })
    

    注意:console 不应在生产中直接使用(或模拟)。你应该实现一个LoggerService(参见:winston)并监视它。

    【讨论】:

    • 那么,是不是不能检查B是否被调用?
    • 不可能。你不能直接测试private 方法,只测试它们的效果。
    猜你喜欢
    • 2019-05-08
    • 2016-08-30
    • 2015-02-28
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多