Проверьте, был ли сервис обновлен внутри метода с помощью Karma

Я хочу проверить, обновил ли сервис, который у меня есть в компоненте, свой атрибут после вызова метода. Как я могу это сделать?

//.ts
public makeSomething(obj:MyObj) {
     //set attribute on my service 
     this.myService.setAtt(true);
}


.spec.ts
  it('should set attrib true on my service ',async(() => {

      let myObj: MyObj;
      component.makeSomething(myObj);
      //should check here if my service has att true!!!!!
      //how??     
 }));
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
23
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я рекомендую вам использовать spyOn(...) с методом toHaveBeenCalled() для проверки обновленного значения после вызова.

Вот пример о том, как его использовать.

Итак, в вашем файле spec это будет выглядеть так:

  it('should set attrib true on my service ',async(() => {

      let myObj: MyObj;
      spyOn(myService, 'myServiceMethod');
      component.makeSomething(myObj);

      expect(myService.myServiceMethod).toHaveBeenCalled();
      // other checks here...
   }));

Не забудьте импортировать свою услугу в заявление it.

it('должен установить attrib true для моей службы',inject([MyService], (myService: Myservice) =>{ не работает. Вы знаете, как я могу это сделать?

Goldbones 08.04.2019 16:34

Это импорт, который не работает, или код внутри самого оператора it?

Maxime Lafarie 08.04.2019 16:39

сам импорт

Goldbones 08.04.2019 16:41

Если этот способ не работает для вас, вы можете попробовать сделать инъекцию непосредственно перед let myObj: MyObj; вот так: const myService = fixture.debugElement.injector.get(MyService);

Maxime Lafarie 08.04.2019 16:43
Ответ принят как подходящий

Вы не должны проверять, был ли обновлен ваш сервис. Что вы должны проверить, так это то, что ваш метод службы был вызван.

Вы проверите, что ваш сервис был обновлен в тестах вашего сервиса.

Это то, что должно делать модульное тестирование: тестировать модуль.

Если вы проверите, что ваша служба была обновлена, вам придется обновлять свои тесты каждый раз, когда вы меняете свою службу. Теперь представьте, что этот сервис используется 400 компонентами, что вы будете делать? Редактировать все компоненты?

Просто проверьте, что функция была вызвана:

const spy = spyOn(component.myService, 'setAttr');
component.makeSomething(myObj);
expect(spy).toHaveBeenCalledWith(true);
expect(spy).toHaveBeenCalledTimes(1);

Как вы используете component.myService? Его нельзя вызвать напрямую

Goldbones 08.04.2019 16:42

Используйте component['myService'], обозначение массива, или сделайте свой сервис общедоступным

user4676340 08.04.2019 16:54

Другие вопросы по теме