JEST:如何对在类的构造函数中调用的方法进行存根

时间:2019-01-16 12:39:15

标签: angular unit-testing jestjs babel

示例如下:

export class ABC {
  constructor() {
    this.method1();
  }

  method1() {
    console.log();
  }
}

假设method1中有一些对外部方法的调用正在停止代码前进。我不想进入method1

现在的问题是当我这样做时:

describe('test cases!', () => {
  let abc: ABC;
  beforeEach(() => {
    spyOn(abc, 'method1').and.stub();
    abc = new ABC();
    jest.resetAllMocks();
  });
});

抛出错误。

在类初始化之后,我不能放置spyOn。 有想法吗?

感谢帮助。

2 个答案:

答案 0 :(得分:0)

method1存在于ABC.prototype上,您可以对其进行监视并替换实现,然后构造新的ABC实例:

class ABC {
  constructor() {
    this.method1();
  }
  method1() {
    throw new Error('should not get here');
  }
}

test('ABC', () => {
  const spy = jest.spyOn(ABC.prototype, 'method1');  // spy on the method of the prototype
  spy.mockImplementation(() => {});  // replace the implementation
  const abc = new ABC();  // no error
  expect(spy).toHaveBeenCalled();  // SUCCESS
})

答案 1 :(得分:0)

要基于@ brian-lives-outdoors答案,我使用以下内容:

describe('test cases!', () => {
  beforeEach(() => {
    ABC.prototype.abc = jest.fn((data) => { result: 'some mock here', data)
    abc = new ABC();
  });
  afterEach(() => {
    ABC.prototype.abc.mockRestore()
  })
});