Возвращаемое шпионское значение некорректно работает в сервисном тесте с использованием жасмина

Я не могу правильно имитировать возвращаемое значение функции внутри моей внедренной службы в моем тесте Angular.

Я использую:

жасмин v2.8.0 и жасмин-ядро v2.8.0

Я упростил код, чтобы его было легче понять. Вот...

Это моя служба, которую я хочу протестировать:

export class NetworkService {

  testNumber = 0;

  constructor(private networkReducerService: NetworkReducerService) {
    this.testNumber = networkReducerService.getNumber();
  }
}

Это мой spec.ts

describe('NetworkService', () => {

  let service: NetworkService;
  let networkReducerServiceSpy: jasmine.SpyObj<NetworkReducerService>;

  beforeEach(() => {

    const nRServiceSpy = jasmine.createSpyObj('NetworkReducerService', ['getNumber']);

    TestBed.configureTestingModule({
      providers: [NetworkService,
        {provide: NetworkReducerService, useValue: nRServiceSpy}
      ]
    });
    service = TestBed.get(NetworkService);
    networkReducerServiceSpy = TestBed.get(NetworkReducerService);
  });

  it('should have the following fields', () => {

    networkReducerServiceSpy.getNumber.and.returnValue(1);

    expect(networkReducerServiceSpy.getNumber).toHaveBeenCalled();

    expect(service.testNumber).toBe(1);
  });

});

Я хочу поиздеваться над этим методом getNumber внутри моего NetworkReducerService

@Injectable({
  providedIn: 'root'
})
export class NetworkReducerService {
  getNumber() {
    return 1;
  }
}

Я получаю следующую ошибку:

Ошибка: ожидается, что undefined будет 1.


person Balázs Fodor-Pap    schedule 09.10.2019    source источник


Ответы (1)


Вы столкнулись с проблемой "а до б". Вы делаете вызов, чтобы установить testNumber в конструкторе вашего NetworkService класса. Поэтому он вызывается при первом создании класса - задолго до того, как вы измените значение своего шпиона. Либо установите значение до создания экземпляра службы, либо выполните рефакторинг вашего NetworkService, чтобы установить значение внутри метода, который можно протестировать путем вызова после создания, а не конструктора.

person dmcgrandle    schedule 16.10.2019