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

时间:2014-12-19 07:16:04

标签: javascript angularjs unit-testing jasmine iife

如何在茉莉花上测试这个模块? 问题是测试$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.
  }));

});

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

那你怎么测试呢?

我在StackOverflow上搜索此问题的解决方案,但没有给出我正在寻找的答案,所以我实现了自己的一个。

2 个答案:

答案 0 :(得分: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

希望它有所帮助!

答案 1 :(得分:0)

问题出在这里

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

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

  1. 注入$rootScopeinject(function (_$controller_, _$rootScope_)

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

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