У меня есть функция, которая принимает лямбду (и лямбда также принимает аргумент). Как я могу издеваться над функцией?
В приведенном ниже примере я пытаюсь смоделировать 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()
правильно получает идентификатор и передает его моему сопоставителю. Это часть теста.
Итак, мой вопрос: как мне справиться с насмешкой над функцией, которая принимает лямбду, которая принимает аргумент ??