Сбой toHaveBeenCalled (), когда в ложном выводе отображаются правильные данные - PullRequest
0 голосов
/ 16 февраля 2020

Я устал от попыток выяснить следующее. В основном у меня есть метод в моем компоненте, который вызывает службу, которая является поддельной. Как только эта служба завершает свою работу, другая служба выполняет некоторые действия по ведению журнала, что также проверяется. Но мой тест провалился, сказав, что служба журналирования не была вызвана:

       process(){
       const that : any = this;
      this.mainService.process().then(result=>{

       return result;

    }).then(result=>{
      //log the operation now after doing some checkups
      let checkups = ""
      that.logService.log('process',result, checkups).then(logged=>{
        console.log(logged)

      }).catch(err=>console.log(err)
    }).catch(err=>console.log(err);

    }

До того, как мы go впереди, выполнение Promise.all () не соответствует опции из-за логики c в место для осмотра. Теперь к биту тестирования:

fit("should log processed request", done => {
  const mainSerivce = TestBed.get(MainService)
  const logService = TestBed.get(LogService)
  spyOn(mainService, "process").and.returnValue(Promise.resolve({id:34,value:64, rank:310));
  const logSpy = spyOn(logSerivce, "log").and.returnValue(Promise.resolve({'done':true}))


  fixture.whenStable().then(finished=>{

    component.process();

    expect(logSpy).toHaveBeenCalled();
    done();

  })

});


expect(logSpy).toHaveBeenCalled();

теперь терпит неудачу, но я вижу в своей консоли результат mock {'done': true} или любого другого значения, которое я передаю, отображается, что означает, что оно было смоделировано и вызвано (?). Чего мне не хватает, так как методы, похоже, были проверены и правильно зарегистрированы в консоли.

1 Ответ

1 голос
/ 18 февраля 2020

Мне кажется, что вам нужно дождаться разрешения обещаний, прежде чем утверждать его, попробуйте:

fit("should log processed request", done => {
  const mainSerivce = TestBed.get(MainService)
  const logService = TestBed.get(LogService)
  spyOn(mainService, "process").and.returnValue(Promise.resolve({id:34,value:64, rank:310));
  const logSpy = spyOn(logSerivce, "log").and.returnValue(Promise.resolve({'done':true}));
  // call the function that will resolve promises
  component.process();
  // whenStable waits for the promises to resolve.
  fixture.whenStable().then(finished=>{
    console.log('Making the assertion !!');
    expect(logSpy).toHaveBeenCalled();
    done();
  });
});

Убедитесь, что вы видите журнал { 'done': true } перед журналом Making the assertion !!. Но поскольку у вас есть обещание, которое разрешается в рамках обещания, это может исправить следующее.

fit("should log processed request", async done => { // check out the async keyword here
  const mainSerivce = TestBed.get(MainService)
  const logService = TestBed.get(LogService)
  spyOn(mainService, "process").and.returnValue(Promise.resolve({id:34,value:64, rank:310));
  const logSpy = spyOn(logSerivce, "log").and.returnValue(Promise.resolve({'done':true}));
  // call the function that will resolve promises
  component.process();
  // when stable waits for the promises to resolve.
  await fixture.whenStable();
  await fixture.whenStable();
  expect(logSpy).toHaveBeenCalled();
  done();
});
...