【问题标题】:Jest spyOn Array.prototype.push function - how can I spy it?Jest spyOn Array.prototype.push 函数 - 我怎样才能窥探它?
【发布时间】:2020-03-09 12:59:55
【问题描述】:

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

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

【问题讨论】:

  • 为什么?您应该测试行为,而不是实现。
  • 如果objects' 值暴露,你的测试会更好。您应该检查是否已将新值添加到 objects,而不是监视数组的 push 方法。
  • 你是对的,但是我无法检查是否添加了对象,因为这是一个私有属性。我不想强制转换为任何 myClass 以访问私有属性。我的实现也不需要对象的 get 方法。那么我该如何测试呢?从我的角度来看,我不应该为测试调整课程,而是为课程测试。从应用程序的角度来看,没有理由将私有财产更改为公共财产。

标签: javascript node.js typescript unit-testing jestjs


【解决方案1】:

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

index.ts:

export class MyClass {
  private objects: any = [];
  public addObject(object: any): any {
    this.objects.push(object);
  }
}

index.test.ts:

import { MyClass } from './';

describe('60507395', () => {
  it('should add object', () => {
    const myClass = new MyClass();
    const pushSpy = jest.spyOn(myClass['objects'], 'push');
    myClass.addObject({});
    expect(pushSpy).toBeCalledWith({});
    expect(myClass['objects']).toHaveLength(1);
  });
});

100% 覆盖率的单元测试结果:

 PASS  stackoverflow/60507395/index.test.ts (9.733s)
  60507395
    ✓ should add object (4ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.ts |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.604s

【讨论】:

  • 感谢@slideshowp2,这是执行测试的正确方法吗?我们应该通过显式检查自身来检查私有属性吗?还是我们应该使用公共函数(以某种方式)检查它?
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 2017-02-27
  • 2021-03-07
  • 1970-01-01
  • 2020-02-24
  • 2021-05-27
  • 2013-07-24
  • 2018-08-25
相关资源
最近更新 更多