Как метод может быть вызван для тестирования и не выполняться?

#angular #typescript #unit-testing #service #karma-jasmine

#angular #typescript #модульное тестирование #Обслуживание #karma-jasmine

Вопрос:

Вот мой компонент :

 @Component({
    selector: 'app-signup',
    templateUrl: './signup.component.html',
    styleUrls: ['./signup.component.scss']
})
export class SignUpComponent implements OnInit {
    specialLink: string;

    constructor( 
        private activatedRoute: ActivatedRoute,
        private techService: TechService
 ) {}

ngOnInit() {
        this.specialLink = this.activatedRoute.snapshot.params.id;

        if (this.specialLink !== undefined) {
            console.log('GOOD1');
            this.setSpecialSignup();
            console.log('GOOD3');
        }

setSpecialSignup() {
        console.log('GOOD2');
        this.techService.getStuff();
    }
  

И вот мои тесты :

 describe('SignUpComponent', () => {
  let component: SignUpComponent;
  let fixture: ComponentFixture<SignUpComponent>;
  let ActivatedRouteMock: any;
  
  beforeEach(async(() => {
    ActivatedRouteStub = {
      snapshot: {
        params: { id: 123 }
      },
    };

    TechServiceMock = jasmine.createSpyObj('TechService', ['getStuff']);
    TechServiceMock.getStuff.and.returnValue(new Promise((resolve, reject) => { resolve() }));

    TestBed.configureTestingModule({
      declarations: [ SignUpComponent ],
      imports: [ RouterTestingModule ],
      providers: [
        {provide: ActivatedRoute, useValue: ActivatedRouteStub},
        {provide: TechService, useValue: TechServiceMock},  
      ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(SignUpComponent);
    component = fixture.componentInstance;
  });


  describe('to get special signup', () => {
      it('should call setSpecialSignup() one time when user is coming from special link', () => {
        spyOn(component, 'setSpecialSignup');
        ActivatedRouteStub.snapshot.params.id = "some_special_link";
        fixture.detectChanges();
        expect(component.setSpecialSignup).toHaveBeenCalled(); // it's working
      });

      it('should call TechService', () => {
        ActivatedRouteStub.snapshot.params.id = "123";
        fixture.detectChanges();
        expect(TechServiceMock.getStuff).toHaveBeenCalled(); // it's NOT working
      });
    });
  

Я хочу проверить, был ли вызван techService.GetStuff(). Служба находится в
Установите метод Specialsignup() в компоненте регистрации.

Метод был вызван, когда я его тестировал, но журналы в консоли говорят мне об обратном. (Это идет GOOD1 и GOOD3 без GOOD2, что странно).

Возможно, это простой вопрос, но есть ли какое-либо объяснение для этого? Как я могу проверить, был ли вызван TechServiceMock.GetStuff()? Я пробовал разные подходы к макетированию TechService, но ни один из них не помог.

Что я пропустил?

Ответ №1:

Если я вас правильно понял, вы ищете метод callThrough(), подробнее о нем вы можете прочитать здесь:https://hatoum.com/blog/2016/11/12/jasmine-unit-testing-dont-forget-to-callthrough

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

1. Идеально! Статья очень информативная и очень понятная, большое спасибо 🙂