web-dev-qa-db-fra.com

Comment taper fortement les moqueries

Je voudrais taper fortement mes moqueries moqueuses. Dans une certaine mesure, je peux le faire fonctionner mais quand une classe a des propriétés privées, je suis bloqué.

Une question supplémentaire, lorsque j'utilise des maquettes (comme je le fais actuellement), le type de retour est du type d'origine, mais lorsque je dois accéder à une méthode ajoutée par Jest, je dois le transtyper de manière _ jest.Mock pour accéder à une méthode. Y a-t-il une meilleure manière de faire cela? J'ai essayé de travailler avec jest.Mock, jest.Mocked, jest.MockInstance.

Si quelqu'un pouvait m'orienter dans la bonne direction, ce serait formidable!

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

Solution de contournement sale:

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. Il y a un assistant qui fait des types: look ts-jest

  2. vous devez généralement tester l'interface publique, pas une implémentation. Au lieu de tester des méthodes privées, vous pouvez extraire cette logique vers une interface publique (peut-être vers une autre classe qui fournit l'interface)

1
Yozi