Ошибка: ожидаемое создание шпиона было вызвано - PullRequest
0 голосов
/ 18 июня 2019

Я пишу тестовые случаи в угловых 7 для компонента с асинхронной службой и получаю эту ошибку:

Ошибка: Ожидаемое создание шпиона было вызвано один раз.Он был вызван 0 раз.

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

export class RegistrationComponent implements OnInit {

   submitRegistrationForm() {
        if (this.profileForm.invalid) {
          this.validateAllFields(this.profileForm);
        } else {
          // send a http request to save this data
          this.guestUserService.create(this.profileForm.value).subscribe(
            result => {
              if (result) {
                console.log('result', result);
                this.router.navigate(['/login']);
              }
            },
            error => {
              console.log('error', error);
            });
        }
  }

Пример модульного теста:

  describe('RegistrationComponent', () => {
      let component: RegistrationComponent;
      let fixture: ComponentFixture<RegistrationComponent>;
      let myService;
      let mySpy;

      beforeEach(async(() => {

        TestBed.configureTestingModule({
          declarations: [RegistrationComponent],
          imports: [ ],
          providers: [
            { provide: GuestUserService, useValue: new MyServiceStub() }]
        })
          .compileComponents();
      }));

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

 it('should submit Registration Form', async(inject([Router], (router) => {
    myService = TestBed.get(GuestUserService);
    mySpy = spyOn(myService, 'create');
    spyOn(router, 'navigate');
    spyOn(component, 'submitRegistrationForm');


component.profileForm.controls['firstName'].setValue('Arjun');
    component.profileForm.controls['lastName'].setValue('Singh');
    component.profileForm.controls['password'].setValue('12345678');
    component.profileForm.controls['confirmPassword'].setValue('12345678');
    component.submitRegistrationForm();

    expect(component.profileForm.invalid).toBe(false);

    expect(component.submitRegistrationForm).toHaveBeenCalled();

    expect(myService).toBeDefined();
    expect(mySpy).toBeDefined();
    expect(mySpy).toHaveBeenCalledTimes(1); // Getting error is this
    expect(router.navigate).toHaveBeenCalled();
  })
  ));

Я попытался переместить замедление шпиона вbeforeEach но все равно выдает ту же ошибку.

как исправить эту ошибку?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

SpyOn поможет вам настроить, как должна реагировать функция, когда она вызывается в ваших тестах. В основном это жасминовый способ создания издевательств.

В вашем случае вы определили, что должен делать тест при вызове сервисной функции, то есть callThrough. Проблема заключается в том, что вам также необходимо воздействовать на сервисную функцию (или на область действия, которая вызывает ваш сервисный метод), чтобы вызвать SpyOn, который будет вызыватьThrough.

it('load snapshot',function(){

  //setup
  spyOn(MyService, 'loadSomething').and.callThrough(); //statement 2

  //act

  //either call the scope function which uses the service 
  //$scope.yourServiceCallFunction();

  //or call the service function directly
  MyService.loadSomething(1); //this will callThrough

});

Вот простой тест, в котором мы будем высмеивать ответ SpyOn на строку

it('test loadSomething',function(){

  //setup
  spyOn(MyService, 'loadSomething').and.returnValue('Mocked');

  //act
  var val = MyService.loadSomething(1);

  //check
  expect(val).toEqual('Mocked');
});
2 голосов
/ 18 июня 2019

Ожидаемое создание шпиона вызвано не как Ошибка, а как неудачный тест.

Это происходит потому, что вы не использовали callThrough ();в вашем шпионе тоже.

 it('should submit Registration Form', async(inject([Router], (router) => {

    myService = TestBed.get(GuestUserService);
    mySpy = spyOn(myService, 'create').and.callThrough(); //callThrough()

    spyOn(router, 'navigate');

    spyOn(component, 'submitRegistrationForm').and.callThrough(); //callThrough()


    component.submitRegistrationForm();

    expect(component.profileForm.invalid).toBe(false);

    expect(component.submitRegistrationForm).toHaveBeenCalled();

    expect(myService).toBeDefined();
    expect(mySpy).toBeDefined();
    expect(mySpy).toHaveBeenCalledTimes(1); 
    expect(router.navigate).toHaveBeenCalled();
  })
  ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...