Как смоделировать функцию, которая принимает лямбда-аргумент - PullRequest
0 голосов
/ 17 октября 2019

У меня есть функция, которая принимает лямбду (и лямбда также принимает аргумент). Как я могу издеваться над функцией?

В приведенном ниже примере я пытаюсь смоделировать connection.xmppStanzas:

Пример класса:

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
        );
    }

}

Проверка на 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()
    });
});

Проблема в том, что when не возвращает поток строф (поэтому все мои тесты, чтобы убедиться, что что-то было сделано с ошибкой строфы) и verify, который я добавил вКонец очень быстро также терпит неудачу, доказывая, почему when не возвращает правильное значение: потому что tsmockito не может соответствовать лямбда-выражению. Очевидно, что когда вы передаете аргумент лямбде, он создает новый экземпляр, и даже deepEqual не будет работать с ним.

Я мог бы сделать when(connection.xmppStanzas(anything())).thenReturn(stanzas$), но я действительно хочу убедиться, что моя функция doSomething() правильно получает идентификатор и передает его моему сопоставителю. Это часть теста.

Итак, мой вопрос: как мне справиться с насмешкой над функцией, которая принимает лямбду, которая принимает аргумент ??

...