我正在尝试使用Jasmine与Karma测试我的AngularJS控制器。当我尝试配置控制器测试的文档过程时,没有创建$scope。实际上,看起来前面的语句根本没有执行。
这是我的控制器声明:
angular.module("myApp", ["ngCookies"])
.controller("myCtrl", function($scope, $window, $location, MyService,
$timeout, $log, $cookies, $q) {
我的测试是这样的:
describe("MyController test", function() {
var $scope;
beforeEach(
module("myApp", ["ngCookies"]));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new(); // It looks like this is never called
scope =$scope;
$controller("myCtrl", {$scope: $scope});
}));
it("Checks the state of various units", function() {
...
});
看起来beforeEach类从来没有被调用过。我假定我需要将我的其余属性注入到控制器中,但如果是这样,我不确定如何。
这是测试运行日志
中的错误FAILED MyController test Checks myFunction starting from blank state
Error: [$injector:modulerr] Failed to instantiate module ngCookies due to:
Error: [ng:areq] Argument 'fn' is not a function, got string
http://errors.angularjs.org/1.3.14/ng/areqp0=fn&p1=not%20a%20function%2C%20got%20string
我在对你的问题的评论中提到的最初问题是,我试图包括angulartis .js的非最小化版本,但没有这样的事情。把angularts .js改成angularts .min.js解决了这个问题。
所以我修复了这个问题,然后得到了相同的"参数'fn'不是函数"错误信息,你做的。
我意识到我们的代码都是在调用module()中创建一个新模块,而不是检索现有的("myApp")模块,这与示例代码不同。
我改变了我的beforeEach()代码从:
module('Sheets', ['ngResource', 'angulartics', 'angulartics.google.analytics']);
module('Sheets');
,现在我传递给inject的回调确实被调用了。
假设,你可以试着改变:
beforeEach(module("myApp", ["ngCookies"]));
beforeEach(module("myApp"));
…然后看看它是否能更进一步。
对我来说,那仍然只是货物崇拜的程序,我不知道为什么它有效,所以在我感觉正确之前,我还有一些学习要做。如果您(或任何人)可以提供为什么检索现有模块与创建新模块相关的原因,那么肯定会有答案或评论投票给您!