typescript - Hur man testar en metod som använder `instanceof` på ett mockat beroende


Jag har en typvakt som kontrollerar instansen av ett beroende.

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

I specfilen har jag mockat klassen A.

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

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

Nu under testning returnerar isObjectOfA alltid false (eftersom instansen av obj i testerna returneras som 'Object' istället för 'A'. Kanske på grund av mocken ??). Finns det något sätt att övervinna detta problem? Koden för objektets skapande ser ut så här,

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

Svar #1

För att klara instanceof-kontrollen behöver prototypkedjan etableras, t.ex. med 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() });
    })
  };
});

Klassens auto-mock kommer också att ge korrekt prototypkedja för en mock.

Relaterade artiklar