在单元测试用例中模拟Angular $window

Mocking Angular $window in unit test cases

本文关键字:Angular window 模拟 单元 测试用例      更新时间:2023-09-26

我一直在尝试对用Typescript编写的angular自定义服务进行单元测试。该服务读取定义在Window对象上的全局变量。我已经做出了承诺,以便将来我可以通过AJAX调用来获取这些信息。以下是我的精简服务:-

export class ProxyDetectiveService {
    public static $inject = [
        $window,
        $q
    ];
    constructor(private $window:ng.IWindowService,
                private $q:ng.IQService) {
    }
    public getProxyUserObject = ():ng.IPromise<any> => {
        this.log.debug('Proxy User Service called, to get proxy user details');
        var deferred = this.$q.defer();
        var proxyDetails = this.$window.portalObject;
        deferred.resolve(proxyDetails);
        return deferred.promise;
    };
}

我的单元测试案例:-

describe('Proxy Detective Service - Unit Test Cases', () => {
    var proxyDetectiveService:any,
        $window:ng.IWindowService;
    beforeEach(() => {
        module('myApp');
    });
    beforeEach(inject(($injector:ng.auto.IInjectorService, _$window_) => {
        proxyDetectiveService = $injector.get('ProxyDetectiveService');
        _$window_ = {
            portalObject: {
                proxyUserDetails: {
                    firstName: 'testFN',
                    lastName: 'testLN'
                }
            }
        };
    }));
    it('should have proxy object defined', function () {
        var promise = proxyDetectiveService.getProxyUserObject();
        promise.then(function (response) {
            expect(response).toBeDefined();
        }).catch(function (response) {
            expect(response).toBeUndefined();
        });
    });
});

以下是我的问题:-

  1. 我的测试用例得到执行,但我没有在服务中看到模拟窗口对象?

  2. 我的承诺然后或捕获子句永远不会被执行?

  3. 有没有更好的方法来实现我的服务?我的目的是返回一个承诺,在未来我可能会使用AJAX调用。

您需要使用$provide在单元测试中提供模拟值:

beforeEach(() => {
    module('myApp', ($provide) => {
      $provide.value('$window', myMockedWindowObject)
    });
});

您还需要调用$rootScope.$apply()来在单元测试中移动承诺。