gpt4 book ai didi

angularjs - 将 Jasmine 与 AngularJS 一起使用时出错

转载 作者:行者123 更新时间:2023-12-01 09:58:06 27 4
gpt4 key购买 nike

我正在使用 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) 如何使用 Controller 的 $rootScope 变量?
3) beforeEach(angular.mock.module('myApp'));beforeEach(angular.module('myApp'));beforeEach(module('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=%24routeParamsProvider%20%3C-%20%24routeParams

如果我在 $controller() 中添加其他参数(即“$routeParams”、“getMailData”),则会出现错误,因为它们未定义。

最佳答案

1) 您试图将您的 Controller 作为模块上的一个字段进行访问是错误的。在你的测试中你应该注入(inject) $controller进入您的测试以创建您的 Controller 。这意味着您应该像下面这样编写测试:

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

2) 见 1

3) angular.mock.module 用于将您的模块注册到您的测试 中的注入(inject)器。它与 module 相同。 angular.module 用于为您的应用程序 创建、注册或检索模块。

关于您的修改:

您没有提供 routeParams 和您的 Controller 所依赖的任何其他服务,因此 $injector 不知道从哪里获取它们并抛出此错误。 $injector 必须知道为 Controller 所需的每个参数注入(inject)什么。你的 Controller 依赖于

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

所以最后你应该像这样创建你的 Controller :

it('should have a mailctrl', inject(function($rootScope, $controller) {
var controller = $controller('mainctrl', {
$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 获取它,并在找不到时抛出异常。

关于angularjs - 将 Jasmine 与 AngularJS 一起使用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21252369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com