Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单元测试AngularJS模块控制器_Javascript_Angularjs_Jasmine - Fatal编程技术网

Javascript 单元测试AngularJS模块控制器

Javascript 单元测试AngularJS模块控制器,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我正在看TODO MVC AngularJS示例,我看到应用程序被定义为一个模块 var todomvc = angular.module('todomvc', []); 在控制器内部,我看到它们被定义为: todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, filterFilter) { //... }); 我的问题是关于单元测试。。。如何为该类编写单元测试 我试过这样的方

我正在看TODO MVC AngularJS示例,我看到应用程序被定义为一个模块

var todomvc = angular.module('todomvc', []);
在控制器内部,我看到它们被定义为:

todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, filterFilter) {
    //...
});
我的问题是关于单元测试。。。如何为该类编写单元测试

我试过这样的方法:

describe('TodoCtrl', function () {
    var controller;

    beforeEach(function () {
        controller = todomvc.TodoCtrl;
    });

    afterEach(function() {
        controller = null;
    });

    describe('addTodo() method', function() {
        console.log(controller)
        it('should do something', function () {
            expect(typeof controller.addTodo).toBe(true); //should fail
        });

    });
});
…但“控制器”最终为空或未定义

我是否需要修改TODO MVC应用程序,以便传递给todomvc.controller()的函数不是匿名的


任何方向都可以,因为我对Angular非常陌生。

您需要使用
$controller
服务对控制器进行单元测试

基本上,你可以这样做:

var scope, ctrl;

beforeEach(inject(function($rootScope, $controller) {
  scope = $rootScope.$new();
  ctrl = $controller('TodoCtrl', {$scope: scope});
}));

//use scope and ctrl as needed

请参见此处的示例:

该示例确实非常有用。。。但是我仍然得到一个“TodoCtrl未定义”错误,这使我认为我需要更改TODO MVC示例中控制器的编写方式(使其更像您链接的示例)。但是我走对了,谢谢!经过进一步检查,在使用您的建议后,我不得不使用“scope.addTodo()”而不是“ctrl.addTodo()”。谢谢在我的例子中,我必须在控制器名称周围添加引号:ctrl=$controller('TodoCtrl',{$scope:scope});将全局函数用作控制器时,不需要引号,但使用引号应适用于全局函数以及通过控制器模块函数注册控制器时。我已将答案更新为使用引号。谢谢