【问题标题】:How to test a method which uses `instanceof ` on a mocked dependency如何测试在模拟依赖项上使用`instanceof`的方法
【发布时间】:2020-12-06 17:27:21
【问题描述】:

我有一个 typeguard 可以检查依赖项的实例。

  private isObjectOfA(obj: A | B ): obj is A {
    return obj instanceof A;
  }

在 spec 文件中,我模拟了 A 类。

jest.mock('./my-package/a', () => {
  return {
    A: jest.fn().mockImplementation(() => {
      return {
        someMethod: jest.fn()
      };
    })
  };
});

import { A } from './my-package/a';

现在在测试期间,isObjectOfA 总是返回 false(因为在测试中 obj 的实例返回为“Object”而不是“A”。可能是由于模拟 ??)。有没有办法克服这个问题? 对象创建的代码如下所示,

this.myObj = someCondition ? new A() : new B();

【问题讨论】:

  • 为什么要向这个函数传递一个模拟?
  • @felixmosh,A 类本身非常复杂,并且有单独的测试用例。我不想测试任何关于 A 的东西,只是为了在这里隔离我的单元测试用例
  • 据我了解,您不会测试 A 类,而是使用它的其他方法...

标签: typescript unit-testing jestjs


【解决方案1】:

为了通过instanceof检查,需要建立原型链,例如Object.create:

jest.mock('./my-package/a', () => {
  const ActualA = jest.requireActual('./my-package/a');

  return {
    A: jest.fn().mockImplementation(() => {
      const a = Object.create(ActualA.prototype);
      return Object.assign(a, { someMethod: jest.fn() });
    })
  };
});

Class auto-mock 也会为模拟提供正确的原型链。

【讨论】:

  • 谢谢。 Object.create(ActualA.prototype) 让我开心。
【解决方案2】:

instanceof 运算符测试构造函数的原型属性是否出现在对象原型链中的任何位置。

这意味着您可以将模拟的原型更改为A。

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2013-01-16
    • 2020-12-05
    • 2018-02-07
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多