Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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 如何使用Jasmine测试具有依赖注入的角度控制器?_Javascript_Angularjs_Jasmine_Chutzpah - Fatal编程技术网

Javascript 如何使用Jasmine测试具有依赖注入的角度控制器?

Javascript 如何使用Jasmine测试具有依赖注入的角度控制器?,javascript,angularjs,jasmine,chutzpah,Javascript,Angularjs,Jasmine,Chutzpah,我正在尝试测试我的一个角度控制器。首先,我想看看,我可以调用控制器中的一个简单函数,它返回两个数字的和 这是控制器的相关部分,带有简单求和函数(为了简单起见,我省略了所有其他函数): 除了$rootscope和$scope之外,控制器还接受多个服务 现在我想从Jasmine调用这个求和函数,并为此制作了这个js /// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homew

我正在尝试测试我的一个角度控制器。首先,我想看看,我可以调用控制器中的一个简单函数,它返回两个数字的和

这是控制器的相关部分,带有简单求和函数(为了简单起见,我省略了所有其他函数):

除了$rootscope和$scope之外,控制器还接受多个服务

现在我想从Jasmine调用这个求和函数,并为此制作了这个js

/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/jasmine/jasmine.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular.min.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular-mocks.js" />
/// <reference path="app.js" />
/// <reference path="detailController.js" />

'use strict';

describe('detailModule', function () {
    beforeEach(module('detailModule'));

    describe('detailController', function () {
        var scope, controller, rootScope;
        var detailService, sharedPropertiesService, facebookService, helperService, uiStateService;

        beforeEach(inject(function (_$rootScope, _$scope, _detailService, _sharedPropertiesService, _facebookService, _helperService, _uiStateService, $controller) {
            rootScope = _$rootScope;
            scope = $rootScope.$new();
            detailService = _detailService;
            sharedPropertiesService = _sharedPropertiesService;
            facebookService = _facebookService;
            helperService = _helperService;
            uiStateService = _uiStateService;

            controller = $controller('detailController', {
                $rootScope : rootScope,
                $scope: scope,
                detailService: detailService,
                sharedPropertiesService: sharedPropertiesService,
                facebookService: facebookService,
                helperService: helperService,
                uiStateService: uiStateService
            });
        }));

        it('should return 10', function () {
            var result = scope.sum(3, 7);
            expect(result).toEqual(10);
        });
    })
})
我不知道我在这里错过了什么


更新:

我试图按照estus的建议简化控制器:

现在看起来是这样的:

/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/jasmine/jasmine.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular.min.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular-mocks.js" />
/// <reference path="app.js" />
/// <reference path="detailController.js" />

'use strict';

describe('detailModule', function () {
    beforeEach(module('detailModule'));

    describe('detailController', function () {
        var scope, controller;

        beforeEach(inject(function (_$rootScope) {
            scope = _$rootScope.$new();

            controller = $controller('detailController', {
                $scope: scope,
            });
        }));

        it('should return 10', function () {
            var result = scope.sum(3, 7);
            expect(result).toEqual(10);
        });
    })
})
//
/// 
/// 
/// 
/// 
"严格使用",;
描述('detailModule',函数(){
在每个(模块(“详细模块”)之前;
描述('detailController',函数(){
var范围、控制器;
beforeach(注入(函数)($rootScope){
scope=$rootScope.$new();
控制器=$controller('detailController'{
$scope:scope,
});
}));
它('应该返回10',函数(){
var结果=范围总和(3,7);
期望(结果)。toEqual(10);
});
})
})
但是,我仍然会遇到以下错误:

无法实例化模块detailModule,原因是: [$injector:modulerr]$injector/modulerr?p0=h

更新2

我解决了。问题是我丢失了参考资料。基本上,所有以某种方式涉及的模块、服务、控制器等都必须被引用

如果它能够自动遍历并解析所有需要的引用,那就太好了。

可以遵循,消息如下:

“家庭作业模块”模块不可用!您要么拼错了模块名,要么忘记加载它。如果注册模块,请确保将依赖项指定为第二个参数

$controller
与当前规范共享喷油器,没有理由为
$controller
指定依赖项,除非它们是本地的或模拟的。应该是:

        controller = $controller('detailController', {
            $scope: scope
        });
TypeError:undefined不是对象(正在计算“scope.sum”)

这意味着范围未定义

这很可能是因为这个代码

rootScope = _$rootScope;
scope = $rootScope.$new(); // it should be either _$rootScope.new() or rootScope.new()

只需更改此项即可进行检查。

这不会更改任何内容。我试图简化测试代码。请参阅更新的问题。@brinch
$injector:modulerr
错误与模块问题有关。出现此错误是因为未加载
homeworkModule
。因此必须引用层次结构中的所有依赖项(模块、控制器、指令、服务等)?看起来
detailModule
取决于
homeworkModule
。并且包含
家庭作业模块
模块的文件应按规范加载。
        controller = $controller('detailController', {
            $scope: scope
        });
rootScope = _$rootScope;
scope = $rootScope.$new(); // it should be either _$rootScope.new() or rootScope.new()