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

#angular #karma-jasmine

#angular #karma-jasmine

Вопрос:

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

 //.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??     
 }));
  

Ответ №1:

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

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

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

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

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

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

Комментарии:

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

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

Ответ №2:

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

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

Итак, в вашем 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 оператор.

Комментарии:

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

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

3. сам импорт

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