5

我有一个接受 lambda 的函数(并且 lambda 也接受一个参数)。如何模拟该功能?

在下面的示例中,我试图模拟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 无法匹配 lambda。显然,当您将参数传递给 lambda 时,它会创建一个新实例,甚至deepEqual无法处理它。

我可以这样做when(connection.xmppStanzas(anything())).thenReturn(stanzas$),但我真的想确保我的函数doSomething()正确检索 ID 并将其传递给我的匹配器。这是测试的一部分。

所以我的问题是:我如何处理模拟一个接受参数的 lambda 的函数?

4

0 回答 0