У меня есть служба Angular, которая запрашивает firestore, используя предложение where на основе переданных аргументов. Я могу запустить это с помощью toHaveBeenCalled, но я бы хотел, чтобы мой тест проверял, действительно ли аргументы передаются как where clause.
Единственный способ, который я мог придумать, - это использовать toHaveBeenCalledWith (...), как в моем коде ниже:
it('should return classes for org and teacher', () => {
spyOn(firestoreCollection, 'valueChanges').and.returnValue(
of<Class[]>([classData])
);
const orgId = '123';
const teacherId = '123';
classService.getClasses(orgId, teacherId).subscribe((classes) => {
expect(classes.length).toBe(1);
expect(serviceMock.collection).toHaveBeenCalledWith(
`organizations/${orgId}/classes`, 'ref => ref.where('teacherUid', '==', teacherId)');
console.log('');
});
});
Однако это не работает как Передаваемая CollectionReference - это функция, и вы не можете приравнять функцию к функции, поэтому она не работает со следующей ошибкой: Expected spy collection to have been called with [ 'organizations/123/classes', Function ] but actual calls were [ 'organizations/123/classes', Function ].
Я могу использовать toHaveBeenCalledWith(
organization / $ {orgId} / classes , jasmine.anything())
, который проходит, но не проверяет, что мое предложение where правильно сформировано и отправлено.
Я пробовал использовать Custom Matcher, но не знаю, как получить доступ к метаданным функции.
Я создал следующее очень общее c сопоставление:
function customTester(signature: string) {
return {
asymmetricMatch: function (actual) {
console.log(actual);
return actual.toString() === signature;
},
};
}
и использовал
.toHaveBeenCalledWith(`organizations/${orgId}/classes`,
customTester("ref => ref.where('teacherUid', '==', teacherId)")
);
в моем тесте. Но мне это действительно плохо пахнет. Мне нужно слишком много знать о реализации, а не просто проверять, что предложение where было вызвано и что оно было вызвано с переменной, которую я передал.
Любые рекомендации о том, как написать свой собственный сопоставитель или лучший способ проверить, что запрос where использовался с моим аргументом?