Javascript Jest spyOn Array.prototype.push函数-如何监视它?

Javascript Jest spyOn Array.prototype.push函数-如何监视它?,javascript,node.js,typescript,unit-testing,jestjs,Javascript,Node.js,Typescript,Unit Testing,Jestjs,我在类中有一个私有属性,我在其中保存对象数组 class myClass { private objects: any = []; public addObject(object: any): any { objects.push(object); } } 我想开玩笑地测试push是否被调用。 我怎么做? 我当前的实现不起作用 describe('myClass ', () => { test('should add object to objects

我在类中有一个私有属性,我在其中保存对象数组

class myClass {
   private objects: any = [];
   public addObject(object: any): any {
      objects.push(object);
   }
}
我想开玩笑地测试push是否被调用。 我怎么做? 我当前的实现不起作用

describe('myClass ', () => {
   test('should add object to objects array', () => {
      const pushSpy = jest.spyOn(Array.prototype, 'push');
      const obj = new myClass();

      obj.addObject({fakeObj})

      expect(pushSpy).toHaveBeenCalled();
   }
}

private
关键字仅用于TypeScript,不用于JavaScript。编译后,属性/方法访问修饰符将被擦除。您仍然可以使用点和方括号访问它们。为了忽略TSC的类型检查,我们使用方括号方式

index.ts

导出类MyClass{
私有对象:any=[];
public addObject(object:any):any{
this.objects.push(对象);
}
}
index.test.ts

从“/”导入{MyClass};
描述('60507395',()=>{
它('应该添加对象',()=>{
const myClass=new myClass();
const pushSpy=jest.spyOn(myClass['objects','push');
myClass.addObject({});
expect(pushSpy).toBeCalledWith({});
expect(myClass['objects')。toHaveLength(1);
});
});
100%覆盖率的单元测试结果:

通过stackoverflow/605073395/index.test.ts(9.733s)
60507395
✓ 应添加对象(4ms)
----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:11.604s

为什么?您应该测试行为,而不是实现。如果暴露
对象
”值,您的测试会更好。您应该检查是否已将新值添加到
对象
,而不是监视数组的push方法。您是对的,但是我无法检查是否已添加对象,因为这是私有属性。我不想为了访问私有属性而强制转换为任何myClass。我的实现也不需要对象的get方法。那么我如何测试它呢?从我的观点来看,我不应该为了考试而调整课堂,而应该为课堂而考试。没有理由从应用程序的角度将私有属性更改为公共属性。谢谢@slideshowp2,这是执行测试的正确方法吗?我们是否应该通过显式检查自身来检查私有属性?或者我们应该(以某种方式)使用公共函数来检查它?