Quiero cambiar los valores de retorno de los métodos de una clase base. Pero no pude encontrar ningún contenido para esto. Por favor ayuda.
Voy a dar un ejemplo.
Una clase básica:
class ParentClass { save() { return "saved"; } }Una clase infantil:
class ChildClass extends ParentClass {}Y probé esto:
El siguiente código está dentro de una carpeta llamada mocks /parent.js .
const ParentClass = jest.fn().mockReturnValue({ save: jest.fn().mockReturnValue("mocked"), });Finalmente este es mi archivo de prueba.
child.spec.js
jest.mock("./parent"); it("should be return mocked value", () => { const child = new ChildClass(); expect(child.save()).toBe("mocked"); });El código de prueba anterior no funciona. Porque da el siguiente error.
Como puedo resolver esto? Gracias.
No pude burlarme de la clase Padres, pero encontré una solución complicada.
jest.spyOn(ParentClass.prototype,"save").mockReturnValue("mocked");Entonces, el código de prueba a continuación funciona sin ningún problema.
it("should be called", () => { const child = new ChildClass(); jest.spyOn(ParentClass.prototype, "save").mockReturnValue("mocked"); expect(child.save()).toBe("mocked"); });Jest ejecuta jest.mock primero antes de evaluar cualquier módulo importado en su conjunto de pruebas, por lo tanto, deberá tener el simulacro definido dentro de su conjunto de pruebas.
Esto debería verse de la siguiente manera:
jest.mock("./parent", () => ({ ParentClass: jest.fn().mockImplementation(() => ({ save: jest.fn().mockReturnValue("mocked"), })) }));Explicación:
./parent debe ser una ruta relativa al módulo parent que desea simular.ParentClass es una exportación con nombre, el objeto simulado devuelto debe tener una clave con el mismo nombrejest.fn().mockImplementation para permitir que se cree una new instancia de clase, que luego devolverá un nuevo objeto con { save: jest.fn().mockReturnValue("mocked") }