【问题标题】:AngularJS, how to extract mock dependency injection like ngMockAngularJS,如何提取像 ngMock 这样的模拟依赖注入
【发布时间】:2014-01-10 23:23:43
【问题描述】:

我们有一个分析服务,它依赖注入到我们的大多数控制器中,以帮助我们跟踪用户所做的操作。

与其在每次创建测试套件时都设置此服务的模拟版本,不如采用 ngMock 方法并抽象模拟。最好的方法是什么?

【问题讨论】:

    标签: angularjs angular-mock


    【解决方案1】:

    编辑

    看起来你可以通过加载一个替换它的模块来覆盖服务。

    http://plnkr.co/edit/mHI19j6FDtV8UElRWvUs?p=preview


    http://plnkr.co/edit/lZg8eQdoQRNtqedcr2UU?p=preview

    如果我正确理解您的问题,您可以做的一件事是不要让您的控制器模块依赖于该跟踪服务,并将该依赖关系置于应用程序级别。然后,在您的测试中,只需显式加载包含模拟版本的模块。

    比如:

    var core = angular.module('core', []);
    var analytics = angular.module('analytics', []);
    var app = angular.module('plunker', ['analytics', 'core']);
    var mockAnalytics = angular.module('mockAnalytics', []);
    
    core.controller('MainCtrl', function($scope, tracker) {
      $scope.track = tracker.track();
    });
    
    analytics.factory('tracker', function () {
      var service = {};
    
      service.track = function () {
        return "I'm real";
      }
    
      return service;
    });
    
    mockAnalytics.factory('tracker', function () {
      var service = {};
    
      service.track = function () {
        return "I'm a mock";
      }
    
      return service;
    });
    

    测试:

    describe('Testing a controller', function() {
      var $scope = null;
      var ctrl = null;
    
      beforeEach(module('core'));
      beforeEach(module('mockAnalytics'));
    
      beforeEach(inject(function($rootScope, $controller) {
        $scope = $rootScope.$new();
    
        ctrl = $controller('MainCtrl', {
          $scope: $scope
        });
      }));
    
      it('should have its $scope.track == "I\'m a mock"', function() {
        expect($scope.track).toEqual("I'm a mock");
      });
    });
    

    【讨论】:

    • 是的,这与 ngMock 所做的非常接近。我宁愿不明确包含mockAnalytics,因为它很可能core 将依赖于analytics。相反,我应该有一个 myAppMocks 模块,它会自动包含在测试模式中并提供这些值作为覆盖。
    • 啊。好吧,我试过了,它似乎奏效了。查看我的编辑。这就是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多