如何在Jasmine/Karma测试中表示控制器?



我正在尝试使用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"));

…然后看看它是否能更进一步。

对我来说,那仍然只是货物崇拜的程序,我不知道为什么它有效,所以在我感觉正确之前,我还有一些学习要做。如果您(或任何人)可以提供为什么检索现有模块与创建新模块相关的原因,那么肯定会有答案或评论投票给您!

相关内容

最新更新