我有一个接受 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 的函数?