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.
