Я пытался перейти на страницу ES6 Class Mocks в документации Jest для тестирования метода на классе TypeScript Consumer
. Этот класс создает экземпляр объекта Provider
и вызывает для него методы, поэтому я хотел бы смоделировать класс Provider
.
Структура каталогов:
.
├── __tests__
│ └── consumers
│ └── Consumer.test.ts
└── js
├── providers
│ └── provider.ts
└── consumers
└── Consumer.ts
provider.ts
:
export class Provider {
constructor() {}
public action(params) {
// do some stuff that we need to mock
return something;
}
}
Consumer.ts
:
import {Provider} from "../providers/provider";
export class Consumer {
private provider: Provider;
constructor() {
this.provider = new Provider();
}
public doSomething() {
const result = this.provider.action(params);
// do something with 'result'
}
}
Моя первая попытка была с "автоматическим макетом" по умолчанию:
Consumer.test.ts
import {Consumer} from "../../js/consumers/Consumer";
jest.mock("../../js/providers/provider");
test("Consumer doSomething", () => {
// a mock Provider will be instantiated in Consumer's ctor:
const consumer = new Consumer();
// however, Provider.action() will return undefined within doSomething()
consumer.doSomething();
});
Это доказывает, что я могу заменить реальную реализацию фиктивной, но мне нужно убедиться, что Provider.action()
возвращает значение, так что в следующем я попытался:
// at some point we can make this return something, but first check it works
const mockAction = jest.fn();
jest.mock("../../js/providers/provider", () => {
return jest.fn().mockImplementation(() => {
return {action: mockAction};
});
});
test("Consumer doSomething", () => {
// throws TypeError: provider_1.Provider is not a constructor
const consumer = new Consumer();
consumer.doSomething();
});
Независимо от того, как я пытался изменить макет, я не могу найти решение, которое позволило бы мне использовать Consumer
как обычно из моего теста. Я бы предпочел не создавать «ручные макеты», чтобы сохранять чистоту кодовой базы и варьировать реализацию макетов между тестами.