当尝试使用Jasmine和AngularJS进行单元测试时,参数'fn'不是函数

时间:2014-12-16 16:37:40

标签: angularjs jasmine

我试图在我的Angular应用程序中使用Jasmine进行一些单元测试,但我遇到了一些错误。

错误

Error: [$injector:modulerr] Failed to instantiate module LocalStorageModule due to:
Error: [ng:areq] Argument 'fn' is not a function, got string

规格

describe("testing the controller", function () {

   var $controllerConstructor;
   var scope;

   beforeEach(module('app', ['ngRoute', 'LocalStorageModule']));
   beforeEach(inject(function ($controller, $rootScope) {
       $controllerConstructor = $controller;
       scope = $rootScope.$new();
   }));

   it("should validate a contact", function () {
       var ctrl = $controllerConstructor('crmContatosCtrl', { $scope: scope });
   });
});

App.js

angular
    .module('app', ['ngRoute', 'LocalStorageModule'])
    .config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
       // My routeProvider here
    }]);

我还没有同时使用Yeoman和Karma,因为这是我使用Angular的fisrt应用程序。

包含的文件

<script src="../../Scripts/jasmine/jasmine.js"></script>
<script src="../../Scripts/jasmine/jasmine-html.js"></script>
<script src="../../Scripts/jasmine/boot.js"></script>
<script src="../../Scripts/angular/angular.js"></script>
<script src="../../Scripts/angular/angular-mocks.js"></script>

<script src="../../Scripts/angular/angular-route.js"></script>
<script src="../../Scripts/angular/angular-local-storage.js"></script>
<script src="../../Scripts/ngStorage.js"></script>
<script src="../../Scripts/ng-infinite-scroll.js"></script>
<script src="../../Scripts/angular/common.js"></script>

<link href="../../Scripts/jasmine/jasmine.css" rel="stylesheet" />

<script src="../core/app.js"></script>
<script src="../crm/contatos.js"></script>
<script src="contatosSpec.js"></script>

1 个答案:

答案 0 :(得分:15)

我认为您的配置可能只是针对测试的依赖项存在问题。没有Karma,我不知道你是如何进行测试的,但我猜你有一个Jasmine的配置文件,你可以在其中指定要包含的文件。您必须包含所有文件,并且必须首先包括所有库。请小心订单,并尝试尊重用于运行应用程序的html文件中的相同内容。

如果订单错误,JS将尝试在包含所需的库之前执行。在你的情况下甚至可能是整个角度叠加。

<强>更新

不要忘记Jasmine使用它自己的html文件,并且如果你不告诉它,它将不包括你经常使用的库。并且不要忘记包括对您的测试至关重要的Angular Mock库

更新2

好的我觉得我找到了你遇到问题的原因

此代码中有错误

beforeEach(module('app', ['ngRoute', 'LocalStorageModule']));

当你使用模块调用模块时有角度(&#39; smthg&#39;,[]),你创建它,而不是调用它。您应该使用此表单,而无需重新导入已包含在主模块中的服务。

beforeEach(module('app'));

检查角度文档https://docs.angularjs.org/guide/module

的“创建与检索”部分