SpyOn вызывает фактическую реализацию метода - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь написать тестовые примеры для углового приложения и использую метод SpyOn(), чтобы шпионить за сервисным методом.

Я тестирую сервис, у которого есть метод с именем getCurrentBoardTimeIdByCurrentTime(), который внутренне вызывает другой метод сервиса с именем
utilService.getHour() и utilService.getWeekday()

Я использовал шпионы в этих 2 методах и возвратил числа 2 и 5 соответственно, после чего getCurrentBoardTimeIdByCurrentTime() должен вернуть 7.

Теперь, когда я вызываю сервисный метод getCurrentBoardTimeIdByCurrentTime(), возвращаемое значение от шпиона не используется, вместо этого вызывается сама функция, вызывающая сбой теста.

BoardSharedService.spec.ts

import { TestBed, inject } from '@angular/core/testing';
import { BoardSharedService } from './board-shared.service';
import { UtilService } from './../shared/util.service';
import { extend } from 'webdriver-js-extender';

describe('BoardSharedService', () => {
  let service: BoardSharedService;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        BoardSharedService,
        UtilService
      ]
    });
  });

  it('should fetch data', () => {
    service = TestBed.get(BoardSharedService);
    const getHourSpy = jasmine.createSpyObj('UtilService', ['getHour']);
    const getWeekDaySpy = jasmine.createSpyObj('UtilService', ['getWeekDay']);

    getHourSpy.getHour.and.returnValue(2);
    getWeekDaySpy.getWeekDay.and.returnValue(5);

    expect(service.getCurrentBoardTimeIdByCurrentTime()).toBe(7);
    expect(service.getCurrentBoardTimeIdByCurrentTime).toHaveBeenCalled();
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

и boardSharedService.ts

import { Injectable } from '@angular/core';
import { UtilService } from './util.service';
import { Day } from './day.enum'
@Injectable()
export class BoardSharedService {

  constructor(private utilService: UtilService) { }

  /**
   * AM = 1
   * PM = 2
   * Weekend AM = 3
   * Friday AM = 4
   * Monday AM = 5
   * Weekend PM = 6
   * Friday PM = 7
  */
  getCurrentBoardTimeIdByCurrentTime() {
    const currentHour = this.utilService.getHour();
    const currentDay = this.utilService.getWeekDay();
    if (currentHour < 6 || currentHour > 17) {
      // PM
      if (currentDay === Day.Friday) {
        return 7; // Friday PM
      } else if (currentDay === Day.Sunday || currentDay === Day.Saturday) {
        return 6; // Weekend PM
      }
      return 2; // PM
    } else {
      // AM
      if (currentDay === Day.Monday) {
        return 5; // Monday AM
      } else if (currentDay === Day.Friday) {
        return 4; // Friday AM
      } else if (currentDay === Day.Sunday || currentDay === Day.Saturday) {
        return 3; // Weekend AM
      }
      return 1; // AM
    }
  }
}

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

BoardSharedService should fetch data
Expected 1 to be 7.
Error: Expected 1 to be 7.
at stack (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1640:17)
at buildExpectationResult (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1610:14)
at Spec.expectationResultFactory (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:655:18)
at Spec.addExpectationResult (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:342:34)
at Expectation.addExpectationResult (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:599:21)
at Expectation.toBe (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1564:12)
at Object.<anonymous> (http://localhost:9876/_karma_webpack_/main.bundle.js:33942:62)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/polyfills.bundle.js:6179:26)
at ProxyZoneSpec.webpackJsonp.../../../../zone.js/dist/proxy.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/vendor.bundle.js:145061:39)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/polyfills.bundle.js:6178:32)
Error: <toHaveBeenCalled> : Expected a spy, but got Function.
Usage: expect(<spyObj>).toHaveBeenCalled()
Error: <toHaveBeenCalled> : Expected a spy, but got Function.
Usage: expect(<spyObj>).toHaveBeenCalled()
at compare (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:3273:17)
at Expectation.toHaveBeenCalled (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1543:35)
at Object.<anonymous> (http://localhost:9876/_karma_webpack_/main.bundle.js:33943:60)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/polyfills.bundle.js:6179:26)
at ProxyZoneSpec.webpackJsonp.../../../../zone.js/dist/proxy.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/vendor.bundle.js:145061:39)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/polyfills.bundle.js:6178:32)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.run (http://localhost:9876/_karma_webpack_/polyfills.bundle.js:5929:43)
at runInTestZone (http://localhost:9876/_karma_webpack_/vendor.bundle.js:144632:34)
at Object.<anonymous> (http://localhost:9876/_karma_webpack_/vendor.bundle.js:144647:20)
at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1950:24)

Нужна помощь.!

Спасибо

1 Ответ

0 голосов
/ 10 мая 2018

Вам необходимо предоставить jasmine spyObj в провайдерах для UtilService.

Тогда вы можете .and.returnValue(some_value) по методам UtilService.

providers: [
        BoardSharedService,
        {provide : UtilService, useValue: jasmine.createSpyObj('UtilService', ['getHour', 'getWeekDay']);
      ]

В спецификации вы можете сделать что-то вроде этого

  it('should fetch data', () => {
    // UPDATE: You are doinf expect(service.getCurrentBoardTimeIdByCurrentTime).toHaveBeenCalled();
    // And you have not spy'd on service.getCurrentBoardTimeIdByCurrentTime method, it will throw error.
    jasmine.spyOn(service, 'getCurrentBoardTimeIdByCurrentTime').and.callThrough();
    service = TestBed.get(BoardSharedService);

    let utilService= TestBed.get(UtilService);

    utilService.getHour.and.returnValue(2);
    utilService.getWeekDay.and.returnValue(5);

    expect(service.getCurrentBoardTimeIdByCurrentTime()).toBe(7);
    expect(service.getCurrentBoardTimeIdByCurrentTime).toHaveBeenCalled();
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...