首页 文章

如何使用茉莉花测试IIFE内定义的angularjs模块?

提问于
浏览
4

我如何在茉莉花上测试这个模块?问题是测试 $controller 非常困难,因为函数隐藏在闭包内,测试它们非常困难 .

换句话说,给定下面的模块定义,为MainCtrl编写单元测试似乎是不可能的 .

(function () {

    'use strict';

    angular.module('app', []);

    function MainCtrl() {
      var mc = this;
      mc.obj = {
        val : 50  
      };
    }

    angular.module('app').controller('MainCtrl', MainCtrl);

} () );

和“典型的”茉莉花测试

describe('app', function(){

  beforeEach(module('app'));

  it('should create an objet with val 50', inject(function(_$controller_) {
    var scope = {},
        ctrl = _$controller_('MainCtrl', {$scope:scope});

    expect(scope.obj.val).toBe(50); // returns Expected undefined to be 50.
  }));

});

当angular在jasmine测试函数中注入 _$controller_ 服务时,创建的控制器实例返回一个未定义的$ scope .

那你怎么测试呢?

我在StackOverflow上搜索这个问题的解决方案,没有给我我想要的答案所以我实现了我自己的一个 .

2 回答

  • 1

    它可以通过以下方式使用茉莉花进行测试:

    describe('app', function () {
    
        var $controller;
    
        beforeEach(function () {
    
            module('app');
    
            inject(function (_$controller_) {
    
                $controller = _$controller_('MainCtrl');
    
            });
        });
    
        //-- spec - test controller
    
        describe('Controller : MainCtrl', function () {
    
            it('should create an object with val 50', function () {
    
                expect($controller.obj.val).toBe(50);
    
            });
        });
    
    });
    

    这是一个jsfiddle

    希望能帮助到你 !

  • 0

    问题出在这里

    var scope = {}, ctrl = _$controller_('MainCtrl', {$scope:scope});

    您正在导入未定义的范围 . 你需要做这样的事情:

    • 注入 $rootScopeinject(function (_$controller_, _$rootScope_)

    • 构建新范围: var scope = $rootScope.$new();

    • 构建控制器: var ctrl = _$controller_('MainCtrl', {$scope: scope});

相关问题