【问题标题】:Why can't I spyOn() certain functions in an injected service?为什么我不能 spyOn() 注入服务中的某些功能?
【发布时间】:2017-12-30 06:29:54
【问题描述】:

我正在测试我的一个调用多个服务的组件。我一直在注入服务并使用spyOn() 模拟虚假函数调用。

我的问题是在此服务上调用特定函数会产生错误Error: <spyOn : refreshThings() method does not exist>。对于同一服务中的其他功能,我可以spyOn()他们就好了。

BasketController依赖ThingService的一些相关代码sn-ps:

编辑:清理代码

单元测试

describe("BasketController test", () => {
    let $componentController: ng.IComponentControllerService;
    let $scope: ng.IRootScopeService;
    let BasketService;
    let ctrl;
    let ThingService: ThingService;

    // Injections and controller
    beforeEach(() => {
        angular.mock.module("myModule");

        angular.mock.inject(
            (_$componentController_: ng.IComponentControllerService,
                _$rootScope_: ng.IRootScopeService,
                _BasketService_: BasketService,
                _ThingService_: ThingService
            ) => {
                $componentController = _$componentController_;
                $scope = _$rootScope_;
                BasketService = _BasketService_;
                ThingService = _ThingService_;
            }
        );

        ctrl = $componentController('basket',
            {
                '$scope': $scope,
                'BasketService': BasketService,
                'ThingService': ThingService
            }
        );

        spyOn(ThingService, 'refreshThings').and.callFake(() => {
        });
    });

    it('should be testable', () => {
        expect(ctrl).toBeDefined();
    });

控制器

export class BasketController {
    static $inject = ["BasketService", "$state", "AlertService", "$filter", "ThingService"];

    constructor(_BasketService_: BasketService,
        private $state: ng.ui.IStateService,
        private AlertService: AlertService,
        private $filter,
        private ThingService: ThingService) {
            this.BasketService = _BasketService_;
    }

    BasketService: BasketService;
    headerData: Object;
    basketForm: ng.IFormController;
    basket: Basket;
    basketList: Array<Basket>;
    selectAll: boolean;

    toolbarButtons: any;
    columns: [string];
    itemFormatter: any;
    self: any;

    $onInit() {
        // GETs baskets from the service
        this.ThingService.refreshThings();
    }
}

注入服务

export class ThingService {

    static $inject = ["ApiHttpService", "$q", "AlertService", "StatusThingService"];
    currentThing: Thing;
    thingList: Array<Thing>;

    constructor(private ApiHttpService: IHttpService,
        private $q: ng.IQService,
        private AlertService: AlertService,
        private StatusThingService: StatusThingService) {
    }

    $onInit() {
    }

    getThing(href:string) {

        let defer = this.$q.defer();

        this.ApiHttpService.get(href).then(
            (res:GetThing) => {
                defer.resolve(res);
            },
            (res) => {
                defer.reject(res);
            }
        );

        return defer.promise;
    }

    getAllThings() {

        let defer = this.$q.defer();

        this.ApiHttpService.get("/api/Thing").then(
            (res:Array<GetThing>) => {
                defer.resolve(res);
            },
            (res) => {
                defer.reject(res);
            }
        );

        return defer.promise;
    }

    refreshThings() {
        this.thingList = [];

        this.getAllThings().then(
            (res:Array<GetThing>) => {

                for(let getTemp of res) {
                    let thing = new Thing();
                    thing.fromGet(getTemp);
                    this.thingList.push(thing);
                }
            },
            (res) => {
                console.error("Unable to refresh things");
            }
        );
    }

}

Main.module.service("ThingService", ThingService);

同样,尝试监视 refreshThings 会导致错误 Error: &lt;spyOn&gt; : refreshThings() method does not exist,而监视服务中的任何其他功能都可以正常工作。

对我来说真的很头疼,所以非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: javascript angularjs typescript jasmine


    【解决方案1】:

    我不知道 Angular,但是ThingService 看起来像一个构造函数/类,所以你可以尝试窥探原型,比如spyOn(ThingService.prototype, 'refreshThings')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2017-09-08
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      相关资源
      最近更新 更多