单元测试Angular指令,控制器运行两次,第一次使用错误的范围

时间:2015-10-06 18:30:11

标签: angularjs unit-testing angularjs-directive jasmine

这很奇怪。

我有一个基本上如下的指令:

    function Toolbar() {
    return {
        scope:{
            resultType: '=',              
        },
        restrict: 'E',
        bindToController: true,
        controller: 'ToolbarController',
        controllerAs: 'toolbar',
        templateUrl: 'toolbar.html'
    };
}

我有一个看起来像这样的控制器:

function ToolbarController($scope, $stateParams) {
    var that = this;
    that.key = $stateParams.key;

    switch (that.resultType){
        case 'r':
            that.flag = false;
            break;
        default :
            vm.flag = true;
            break;
    }
 }

我有一个看起来像这样的测试:

it('should show the the correct flag', function() {
        scope = $rootScope.$new();
        scope.resultType = 'r';
        toolbarController = $controller('ToolbarController', {$scope: scope, 
    $stateParams: $stateParams});
            expect(toolbarController.flag).toBe(false);
        });

当我只是测试时,控制器似乎执行了两次。我的响应类型第一次未定义且测试失败。第二次是对的,但到那时测试已经失败了。

之前有人见过这个,知道问题是什么吗?

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:0)

使用bindToController测试angularJS driective控制器,您必须将绑定的项目作为第三个参数传递给$controller,如下所示:

toolbarController = $controller('ToolbarController', {$scope: scope, 
$stateParams: $stateParams}, { resultType: 'r' });

请参阅$controller的angularJS文档了解更多

答案 1 :(得分:0)

[叹息]

发现问题。有人添加了一个beforeEach,在那里他们创建了一个工具栏实例并将其分配给一个与我的本地变量使用相同名称的实例变量。

关闭谋杀^某人,谢谢!

^不是字面意思,虽然我很受诱惑。