javascript - 测试中 AngularJS 中 Controller 初始化时调用的模拟操作

标签 javascript testing angularjs

我的 angularjs Controller 基本上如下所示

app.controller('MyCtrl', function($scope, service) {

  $scope.positions = service.loadPositions(); // this calls $http internally

  $scope.save = function() {
    ...
  };

  // other $scope functions here

});

现在,每次我为 $scope 中的任何方法编写测试时,我都需要 stub service.loadPositions() ,如下所示:

  it(should 'save modified position', function($controller, service, $rootScope) {
    spyOn(service, 'loadPositions').andReturn(fakeData);

    var scope = $rootScope.$new();
    $controller('MyCtrl', {$scope: scope});

    // test stuff here
  })

有什么方法可以避免每次测试中的第一次 stub 吗?我的意思是,如果我已经测试过在 Controller 启动时调用此操作,那么我实际上不需要在每个下一个测试中对此进行 stub 。这会在每个测试中引入大量重复。

编辑

我偶然发现了ngInit,我想我可以使用它,但似乎不推荐这样做,但我不确定为什么?

最佳答案

describe 函数中使用 beforeEach:

describe('My test', function() {
    var $controller,
        $rootScope,
        serviceMock;

    beforeEach(function() {
        serviceMock = { loadPositions: function() {} };
        spyOn(serviceMock, 'loadPositions').andReturn(fakeData);

        inject(_$controller_, _$rootScope_) {
            $rootScope = _$rootScope_.$new();
            $controller = _$controller_('MyCtrl', 
                {$scope: $rootScope, service: serviceMock});
        };
    });

    it('should save modified position', function() {       
        // test stuff here
    });
});

请注意,我也将 Controller 初始化移至 beforeEach,因此您不必在每个测试中再次执行此操作。

以防万一您想知道 inject 参数中的下划线的用途,它们使测试能够声明本地 $controller 变量和本地 >$rootScope 变量。 Angular 在解决函数依赖关系时会忽略它们。

更新:示例代码中有一个小错误。刚修好。

关于javascript - 测试中 AngularJS 中 Controller 初始化时调用的模拟操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144950/

相关文章:

java - Spring框架在测试应用方面有哪些优势?

android - Dagger2 禁用 AndroidInjection.inject(this);用于仪器测试

AngularJs 用户界面路由器。 Protractor 测试失败

javascript - Angular、ng-repeat 创建多组单选按钮

javascript - 缩小 Javascript 时的 G-WAN 问题

javascript - 如果字段为空 Bootstrap ,如何禁用发送按钮

ios - 如何在回归测试中模拟 UITouches?

javascript - 如何测试从 Promise 对象获取数据的 Controller

javascript - 如何在 TypeScript 中表示包含多种类型的二维数组?

javascript - 一直显示错误信息。如何处理这个错误?