使用spyOn和Jest测试私有方法

17 javascript testing typescript 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);
  });
});
Run Code Online (Sandbox Code Playgroud)

我的课:

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;
  }
}

Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

Pau*_*uli 18

最简单的解决方案是监视计算器类的“Sum”方法,我想到的是:

jest.spyOn(calculator as any, 'Sum').<do-something>();
Run Code Online (Sandbox Code Playgroud)


小智 13

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

let result = (Calculator as any).Sum(2,3);
expect(result).toBe(5);
Run Code Online (Sandbox Code Playgroud)

我希望这能解决你的问题。


小智 6

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

班级

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

测试

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

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

Run Code Online (Sandbox Code Playgroud)

  • 与加法一起工作:`jest.spyOn(Calculator.prototype as any, 'Sum');` (11认同)

sat*_*ime 1

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

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

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

  • 为什么我错了?我说如果你不能访问它,如果你可以 - 当然你可以使用 Spy,尽管测试私有的东西是违反测试方法的。 (2认同)