加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Jasmine与AngularJS时出错

发布时间:2020-12-17 07:07:46 所属栏目:安全 来源:网络整理
导读:我使用jasmin用以下代码测试我的AngularJs项目 controllersSpec.js describe('myApp',function(){ beforeEach(angular.mock.module('myApp')); it('should have a mailctrl',function() { expect(myApp.mailctrl).toBeDefined(); });}); controller.js var m
我使用jasmin用以下代码测试我的AngularJs项目

controllersSpec.js

describe('myApp',function(){

    beforeEach(angular.mock.module('myApp'));

    it('should have a mailctrl',function() {
        expect(myApp.mailctrl).toBeDefined();
    });
});

controller.js

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

myApp.controller('mailctrl',['$scope','$routeParams','$rootScope','getMailData','$angularCacheFactory',function ($scope,$routeParams,$rootScope,getMailData,$angularCacheFactory) {
           ##....controller content....##
    }
]);

SpecRunner.html

< script type =“text / javascript”src =“../ lib / angular / angular.min.js”>< / script>
??< script type =“text / javascript”src =“lib / jasmine-2.0.0 / jasmine.js”>< / script>
??< script type =“text / javascript”src =“lib / jasmine-2.0.0 / jasmine.js”>< / script>
??< script type =“text / javascript”src =“lib / jasmine-2.0.0 / jasmine-html.js”>< / script>
??< script type =“text / javascript”src =“lib / jasmine-2.0.0 / boot.js”>< / script>
??< script type =“text / javascript”src =“../ test / lib / angular / angular-mocks.js”>< / script>
??< script src =“../js / controller.js”>< / script>
??< script src =“../ test / unit / controllersSpec.js”>< / script>

现在,当我在浏览器中打开Specrunner.html时,我收到了以下错误
预期未定义的定义.
我有以下问题
1)我哪里出错了?
2)如何使用控制器的$rootScope变量?
3)beforeEach的区别是什么(angular.mock.module(‘myApp’));和beforeEach(angular.module(‘myApp’));和beforeEach(模块(‘myApp’));

编辑:
我已将代码修改为

describe('myApp',function(){
    beforeEach(angular.mock.module('myApp'));        
    it('should have a mailctrl',inject(function($rootScope,$controller) {
        var controller = $controller('mailctrl',{ $scope: $rootScope.$new(),$rootScope: $rootScope });
        expect(controller).toBeDefined();
}));

并得到以下错误 –
错误:[$injector:unpr] http://errors.angularjs.org/undefined/ $injector / unpr?p0 = $routeParamsProvider < - $routeParams 如果我在$controller()中添加其他参数(即’$routeParams’,’getMailData’)错误来自未定义.

解决方法

1)您尝试将控制器作为模块上的字段访问时出错.在您的测试中,您应该在测试中注入 $controller来创建控制器.这意味着您应该编写如下测试:

it('should have a mailctrl',$controller) {
   var controller = $controller('mainctrl',$rootScope: $rootScope,...  }) // rest of your dependencies
   expect(controller).toBeDefined();
}));

2)见1

3)angular.mock.module用于在测试中将模块注册到进样器.它与模块是一回事. angular.module用于为您的应用程序创建,注册或检索模块.

关于你的编辑:

您没有提供routeParams和您的控制器所依赖的任何其他服务,因此$injector不知道从哪里获取它们并且抛出此错误. $injector必须知道控制器所需的每个参数要注入的内容.你的控制器取决于

> $rootScope:由angular提供
> $scope:可以通过$rootScope创建.$new()
> getMailData:这是你的服务,你必须为此提供一个模拟
> $routeParams:这是角度内置结构,但没有专用的模拟,但由于它是一个非常简单的对象,你可以自己提供一个模拟.
> $angularCacheFactory:这是第三方服务,你也必须为此提供模拟

所以最后你应该像这样创建你的控制器:

it('should have a mailctrl',{ 
         $scope: $rootScope.$new(),'$routeParams': {},// whatever  it needs to be to be able to test your controller
         $rootScope: $rootScope,'getMailData': getMailDataMOCK // this object is created by you in your test code
         '$angularCacheFactory': $angularCacheFactoryMOCK
       }) 
   expect(controller).toBeDefined();
}));

如果你没有提供任何这些参数,那么它将尝试从$injector获取它并在未找到时抛出异常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读