使用spyOn和Jest测试私有方法

时间:2020-06-03 11:21:45

标签: javascript typescript testing jestjs

我在Calculator类中的函数是私有的,我无法通过这种方式进行测试,

describe('calculate', function() {
  it('add', function() {
    let result = Calculator.Sum(5, 2);
    expect(result).toBe(7);   
  });

  it('substract', function() {
    let result = Calculator.Difference(5, 2);
    expect(result).toBe(3);
  });
});

我的课:

export default class calculator {
  private Sum(a: number, b: number): number {
    let c = a + b;
    return c;
  }

  private Difference(a: number, b: number): number {
    let c = a - b;
    return c;
  }
}

如何在私有方法上使用spyOn来修改此测试?

感谢您的帮助

5 个答案:

答案 0 :(得分:1)

如果您确实需要测试私有方法,则可以创建一个扩展Calculator的新类,仅用于测试。

child类中,我们使用父级private的{​​{1}}方法。

这可以用打字稿完成,没有错误。

public

答案 1 :(得分:0)

如果它是您无法访问的私有数据,则不应测试它,因为它是可能会更改的内部实现。

您需要覆盖在内部使用此类的类的公共接口,以确保它们正确地工作,如何在内部工作是他们自己的事。

否则,您需要将其公开,或者至少将其作为依赖项传递,以便可以使用其模拟版本。

答案 2 :(得分:0)

在编译时检查TypeScript私有方法的可见性。禁用类型检查时,可以在测试中访问它们。这包括使用spyOn监视私有方法,但是当直接调用它们时,它们并不能从间谍中受益。

Calculator是一个类,应实例化以便访问其方法:

let calculator = new Calculator();
let result = calculator['Sum'](5, 2);
expect(result).toBe(7);   

答案 3 :(得分:0)

在 Typescript 中,它不允许您测试私有方法。所以你需要一些东西来摆脱这种行为。你能做的就是这样

let result = (Calculator as any).Sum(2,3);
expect(result).toBe(5);

希望能解决您的问题。

答案 4 :(得分:0)

你可以尝试jest.spyOn来获取私有方法的实现

export default class Calculator {
  private Sum(a: number, b: number): number {
    let c = a + b;
    return c;
  }
}

测试

const handleErrorSpy = jest.spyOn(Calculator.prototype, 'Sum');
const getSumImplementation = handleErrorSpy.getMockImplementation();

expect(getSumImplementation(1, 2)).toEqual(3);