typescript - tsmockito - Hvordan mocke en funksjon som tar et lambda-argument


Jeg har en funksjon som tar en lambda (og lambden tar også et argument). Hvordan kan jeg mocke funksjonen?

I eksemplet nedenfor prøver jeg å mocke connection.xmppStanzas:

Eksempelklasse:

type Matcher<T> = (t: T) => boolean;

const myMatcher: Matcher<Element> = (id: string) => ...;

class SomeClass {
    constructor(private readonly idSource: IdSource,
                private readonly connection: XmppConnection) {}

    doSomething() {
        const id = this.idSource.getId();
        this.connection.xmppStanzas(myMatcher(id)).pipe(
            ...do something with the stanza
        );
    }

}

Test for SomeClass:

describe('SomeClass', () => {
    let idSource: IdSource;
    let connection: XmppConnection;
    let instance: SomeClass;

    beforeEach(() => {
        idSource = mock(idSource);
        connection = mock(XmppConnection);

        instance = new SomeClass(
            instance(idSource),
            instance(connection)
        );

        when(idSource.getId()).thenReturn(someId);
    });

    it('this is an example test', () => {
        const stanzas$ = new BehaviorSubject(myTestStanza);
        when(connection.xmppStanzas(myMatcher(someId))).thenReturn(stanzas$);

        ...test that the right thing was done with the stanza

        verify(connection.xmppStanzas(myMatcher(someId))).once()
    });
});

Problemet er at when ikke returnerer stanzas-strømmen (så alle testene mine for å sikre at noe ble gjort med stanza mislykkes) og verify som jeg la inn til slutt også mislykkes, noe som viser hvorfor when ikke returnerer riktig verdi: fordi tsmockito ikke kan matche lambdaen. Tilsynelatende, når du passerer et argument til lambdaen, lager det en ny instans, og selv deepEqual vil ikke fungere på den.

Jeg kunne gjort when(connection.xmppStanzas(anything())).thenReturn(stanzas$), men jeg vil virkelig sørge for at funksjonen min doSomething() henter ID-en korrekt og sender den til matcher-en min. Det er en del av testen.

Så spørsmålet mitt er: hvordan håndterer jeg å mocke en funksjon som tar en lambda som tar et argument??

Relaterte artikler