Как смоделировать метод, который не реализован в классе, получив «TypeError: this.initialize не является функцией» - PullRequest
0 голосов
/ 15 января 2019

Я пишу модульные тесты Jasmine для родительского сервиса, который наследуется всеми остальными сервисами. Метод initialize() не реализован в родительской службе, но реализован всеми дочерними службами. У меня возникают проблемы с издевательством / заглушением метода initialize(), и я не могу прибить, если это происходит из-за того, что он не реализован или, возможно, из-за точечной нотации this или, возможно, мои макеты настроены неправильно.

Ошибка, которую я получаю, - TypeError: this.initialize is not a function, что имеет для меня большой смысл, поскольку initialize() определено только в дочерних классах. Но могу ли я заглушить вызов метода, чтобы вернуть то, что я хочу? Ниже моя текущая попытка.

Услуга:

(function() {
  "use strict";

  angular
    .module("shared-services.module")
    .factory("ResourceService", ResourceService);

  ResourceService.$inject = [
    "Session"
  ];

  function ResourceService(
    Session
  ) {

  var service = {};

  service.makeCopy = makeCopy;

  return service;

  function makeCopy(resource) {
    var copy = resource.id;
    copy = this.initialize(resource);
    copy.id = id;
    if (!!id) {
      copy.new = false;
    }
    return copy;
  }
}})();

и тест:

describe('resource service tests', function () {

    var mockSession, sut;
    beforeEach(function () {
        angular.mock.module(function ($provide) {

            $provide.service('Session', function () {
                this.alert = jasmine.createSpy('alert');
            });
        });
        angular.mock.module('shared-services.module');
    });
    beforeEach(inject(function (Session, _ResourceService_) {
        mockSession = Session;

        sut = _ResourceService_;
    }));

    describe("departments component", () => {
        it("should be defined", () => {
            expect(sut).toBeDefined();
            let resource = {
                id: 1,
                new: true
            }
            // trying to stub out the initialize method call to just return the resource
            let x = jasmine.createSpy('this', ['initialize']).and.callFake(function (resource) {
                return resource;
            });
            let copy = sut.makeCopy(resource);
            expect(copy.id).toBe(1);
        })
    })
});

Я бы хотел, чтобы мой тест запустился, вызвал мой смоделированный / заглушенный метод и вернул исходный ресурс. Взамен испытательных бомб.

...