angularjs - 如何在测试自定义 AngularJS 提供程序时注入(inject) $window?

标签 angularjs jasmine karma-runner karma-jasmine

我需要对覆盖 $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');
    });
});

完整的 fiddle here

关于angularjs - 如何在测试自定义 AngularJS 提供程序时注入(inject) $window?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817188/

相关文章:

javascript - 如何为 jquery 调用 `$(some)` 创建 spy ?

javascript - 有没有办法检查我的脚本是否在 phantomjs 中运行?

unit-testing - 第 3 方库测试 angular 2 webpack

angularjs - Angular-Karma Controller 测试 : UI-Router persistent $stateParams dependency

javascript - Angular POST 到 API 不传递数据

javascript - 在 Angular js 中更改导航菜单的类

javascript - SystemJS - 时刻不是函数

javascript - AngularJs:ng-View 不更新

javascript - 将 Jasmine 与 Sublime Text 2 结合使用

javascript - 大于 100 但从 html 传递字符串的 Protractor 测试用例