Как провести модульное тестирование службы angularfirestore, которая использует предложение where? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть служба 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 использовался с моим аргументом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...