JestでTypeScriptのinterfaceの一部のみをモックする
TypeScriptでこんな感じのinterfaceがあった時
code:typescript
export interface FooRepository {
list(): Promise<Foo[]>
find(fooID: FooID): Promise<Foo>
}
ユースケースから使うメソッドは一部分のみなので,使うメソッドだけをモックしたい
普通にモックしようとすると全てのメソッドをモックする必要がある
code:typescript
const fooRepositoryMock = jest.mocked<FooRepository>({
list: jest.fn(() => Promise.resolve(/** 戻り値 */)), // 使わないけどモックする必要がある
find: jest.fn(() => Promise.resolve(/** 戻り値 */)), // 使うメソッドなのでここだけモックしたい
});
使わないメソッドをモックするのは無駄だし,増えたり変更したりする度に修正は面倒
解決方法
一度Partialを挟んでから型アサーションする
code:typescript
const fooRepository = jest.mocked<Partial<FooRepository>>({
find: jest.fn(() => Promise.resolve(/** 戻り値 */)),
}) as jest.Mocked<FooRepository>;
メソッドの戻り値などをタイプセーフにできるので変更があってもすぐに気付ける
as unknown as FooRepositoryのように一度unknownを挟んでも実現できるけど,型が間違っていても気付けないので,Partialを挟んだほうが良さそう