测试自定义 AngularJS 提供程序时如何注入$window



我需要对覆盖$windowProvider的自定义提供程序进行单元测试。

提供商.js

angular
  .module('customProvider', [])
  .provider('cprovider', [
    '$windowProvider',
    function ($windowProvider) {
      var $window = $windowProvider.$get();
      var platform = function () {
        // some code there use $window
      };
      this.platform = platform;
      this.$get = function () {
        return {
          platform: platform
        };
      };
    }
  ]);

cprovider.spec.js

describe('cprovider', function () {
  var cprovider, mockWindow;
  describe("xxxx", function () {
    beforeEach(function () {
      mockWindow = {navigator: {userAgent: 'xxxx'}};

      module('customProvider', function ($provide) {
          $provide.value('$window', 'mockWindow');
      });
      inject(function (_cprovider_) {
        cprovider = _cprovider_;
      });
    });
    it('should something', function () {
      // Arrange and Act in beforeEach.
      // Assert. WON'T WORK
      expect(cprovider.platform()).toBe('xxx');
    });
  });
});

无法正确模拟$windowProvider。有人知道我该怎么做吗?

你可以窥探$window:

beforeEach(function () {
    angular.mock.module('customProvider');
    inject(function (_$window_, _cprovider_) {
        cprovider = _cprovider_;
        $window = _$window_;
        spyOn($window, 'alert');
    });
});

在这里完成小提琴

最新更新