web-dev-qa-db-ja.com

冗談モックを強くタイプする方法

冗談モックを強くタイプしたい。ある程度は動作させることができますが、クラスにプライベートプロパティがあると行き詰まります。

追加の質問、モックを使用する場合(現在の方法)、戻り値の型は元の型ですが、Jestによって追加されたメソッドにアクセスする必要がある場合は、型キャストする必要がありますjest.Mockメソッドにアクセスします。これを行うより良い方法はありますか?私はjest.Mockjest.Mockedjest.MockInstance

誰かが私を正しい方向に向けることができればそれは素晴らしいことです!

class MyTest {
    constructor(private readonly msg: string) {}

    public foo(): string {
        return this.msg;
    }
}

const myTestMock: jest.Mock<MyTest, [string]> = jest.fn<MyTest, [string]>(() => ({
    msg: 'private',
    foo: jest.fn().mockReturnValue('aaa'),
}));
// Results in error:
// Type '{ msg: string; foo: Mock<any, any>; }' is not assignable to type 'MyTest'.
// Property 'msg' is private in type 'MyTest' but not in type '{ msg: string; foo: Mock<any, any>; }'

const myTestMockInstance: MyTest = new myTestMock('a');
console.log(myTestMockInstance.foo()); // --> aaa

// Accessing jest mock methods:
(<jest.Mock>myTestMockInstance).mockClear(); // <-- can this be done without type casting

汚い回避策:

const myTestMock: jest.Mock<MyTest, [string]> = jest.fn<MyTest, [string]>(
    // Cast to any to satisfy TS
    (): any => ({
        msg: 'private',
        foo: jest.fn().mockReturnValue('aaa'),
    })
);
12
Michael
  1. タイプを作成するヘルパーがあります:look ts-jest

  2. 通常は、実装ではなくパブリックインターフェイスをテストする必要があります。プライベートメソッドをテストする代わりに、そのロジックをパブリックインターフェイス(おそらくインターフェイスを提供する別のクラス)に抽出できます。

1
Yozi