16

在这种情况下,我有一个使用 angular.module().controller() 创建的控制器

myModule = angular.module('myApp.controllers', [])
                   .controller('testCtrl', ['$scope', function($scope){
                           $scope.test = 'this is a test';
                    }]);

现在,我需要使用 mocha 来测试我的控制器是否正常工作。在 Angular 中,有一些示例将控制器声明为全局函数(例如http://docs.angularjs.org/tutorial/step_04),因此它们使用

function PhoneListCtrl() {...}
.....
beforeEach(function() {
   scope = {},
   ctrl = new PhoneListCtrl(scope);
});

it('shod test whatever PhoneListCtrl does ', function() {
   expect(scope.someProp).toBe('whateverValue');
});    

所以问题是:

1)如何对使用 angular.module().controller() 声明的控制器进行类似的测试

2)如何使用摩卡做到这一点

4

2 回答 2

28

AngularJS 提供了模拟,在测试时为依赖注入提供了一些有用的功能。

例子:

(在茉莉花中)

假设我们要执行官方教程中的第一个测试,并且我们已经定义了一个控制器模块。(您可以命名模块名称,但我想保持简单)

var Controllers = angular.module('controllers', []);

Controllers.controller('PhoneListCtrl', ['$scope', function($scope){
    $scope.phones = [{name: "Nexus S", snippet: "Fast..."},
                     {name: "Motorola XOOM...", snippet: "The Next...."},
                     {name: "MOTOROLA XOOM...", snippet: "The Next, Next..."}];
}]);

然后我们为 out app 创建一个模块并将其注入我们的控制器模块

var PhonesApp = angular.module('phoneApp', ['controllers']);

最后我们可以这样测试

describe('phonesApp', function() {
    describe('phoneApp controllers', function() {
        beforeEach(module('controllers'));
        describe('PhoneListCtrl', function() {
            it('should create "phones" model with 3 phones',
                inject(function($rootScope, $controller) {

                var scope = $rootScope.$new();
                var ctrl = $controller("PhoneListCtrl", {$scope: scope });
                expect(scope.phones.length).toBe(3);
            }));
        });
    });
});

我没有在摩卡中做过,但我想这个过程是相似的。

Pd:我使用 CoffeeScript 完成了教程,这里是相关位https://gist.github.com/4163147

于 2012-11-28T18:48:23.543 回答
15

如果您使用的是 mocha,请注意不支持angular.mock.moduleangular.mock.inject除非您已升级到 angular-1.1.1。我在同一条船上,但由于另一个问题我无法升级。

我想使用 mocha,因为我的服务器端测试是在 mocha 中进行的,而且我更希望双方都拥有相同的测试框架,所以我有点麻烦。

所以,如果你不能使用注入/模块,那么你可以这样尝试:

var $injector = angular.injector(['your-app-name', 'ng']),
  $controller = $injector.get('$controller'),
  $scope = $injector.get('$rootScope');

describe('my app controllers', function () {
  describe('FooCtrl', function () {
     it('should do something', function () {
        // scope can be any object you want; could be $rootScope from above
        var params = { $scope: { } },
          ctrl = $controller('FooCtrl', params);
        // TODO: test ctrl
     });
  });
});
于 2012-12-10T19:33:49.277 回答