2

我有 angularjs 控制器,基本上如下所示

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

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

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

  // other $scope functions here

});

现在每次我为 $scope 中的任何方法编写测试时,我都需要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
  })

有什么办法可以避免每次测试中的第一次存根?我的意思是如果我已经测试过这个动作是在控制器启动时调用的,我真的不需要在每次下一个测试中存根这个。这会在每次测试中引入大量重复。

编辑

我偶然发现ngInit,我认为我可以使用它,但似乎不推荐这样做,但我不知道为什么?

4

2 回答 2

3

beforeEach在你的describe函数中使用 a :

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
    });
});

请注意,我也将控制器初始化移动到了beforeEach,因此您不必在每次测试中都重新进行。

万一您想知道inject参数中的下划线是干什么用的,它们使测试能够声明一个局部$controller变量和一个局部$rootScope变量。Angular 在解决函数依赖关系时会忽略它们。

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

于 2013-08-09T11:50:52.120 回答
1

您可以将其移入beforeEach()并用于$provide始终退回您的虚假服务。

不知道你所有的测试代码这样的东西应该可以工作。

var scope, controller;

beforeEach(module("app", function($provide){
    var mockedService = {
      loadPositions: function(){return fakeData;}//or use sinon
    };

    $provide.value('service', mockedService);
});   
beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    controller = $controller;
}));

it(should 'save modified position', function() {


    controller('MyCtrl', {$scope: scope});

    // test stuff here
});
于 2013-08-09T11:52:14.737 回答