Angular的Jasmine测试无法找到我的控制器

时间:2014-01-22 22:37:53

标签: javascript angularjs jasmine

我在为Angular应用程序设置Jasmine测试时遇到问题。 Jasmine找不到我的控制器(我怀疑它根本找不到我的应用程序)。

以下示例演示了我遇到的问题:

angular.module('testMod', [])
    .controller('testController', ['$scope', function($scope) {
        $scope.person = {name: 'Jim', age: 14};

        function innerFunction() {}

    }]);

测试:

  describe('testMod suite', function() {

        var $rootScope, myController;

        beforeEach( inject(function($injector) {
            angular.module('testMod');

            $rootScope = $injector.get('$rootScope');
            var $controller = $injector.get('$controller');
            myController = $controller('testController', {$scope: $rootScope});

        }) );

    it('works', function() {
        expect( typeof myController.innerFunction).toBe('function');
    });
});

行失败

myController = $controller('testController', {$scope: $rootScope});

我看到的错误是:

Error: [ng:areq] Argument 'testController' is not a function, got undefined

我正在使用独立的SpecRunner.html for Jasmine,加载了我的应用和规范:

   <!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Jasmine Spec Runner v2.0.0</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png">
  <link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css">

  <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>
  <!-- angular-mock must be loaded AFTER Jasmine -->
  <script type="text/javascript" src="../src/angular-1.2.5.min.js"></script>
  <script type="text/javascript" src="../src/angular-mock-1.2.5.js"></script>

    <!-- include source files here... -->
  <script type="text/javascript" src="../src/testMod.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="spec/testMod.Test.js"></script>

</head>

<body>
</body>
</html>

任何建议都表示赞赏 - 我一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:2)

您的测试有几个问题:

  1. 您没有正确注射范围。
  2. 您没有正确使用范围。
  3. 有一个toBeDefined()方法来检查函数是否已定义,无需键入check。
  4. 将测试中的代码更改为

    describe('testMod suite', function() {
    
    var $rootScope, testController;
    
    beforeEach(module('testMod'));
    beforeEach(inject(function($controller, $rootScope) {
        myScope = $rootScope.$new();
        ctrl = $controller('testController', {
            $scope: myScope
        });
    }));
    
    it('works', function() {
        expect( myScope.innerFunction).toBeDefined();
    });
    });
    

    另外,将角度控制器代码更改为:

    angular.module('testMod', [])
    .controller('testController', ['$scope', function($scope) {
        $scope.person = {name: 'Jim', age: 14};
    
        $scope.innerFunction = function() {}
    
    }]);