2014-02-20 56 views
3

的假设具有外部控制器的指令的控制器:如何嘲笑的AngularJS指令

.directive('d1', function() { 
    return { 
    controller: 'd1controller', 
    restrict: 'E', 
    link: function ($scope, $element, $attributes, $controller) { 

     $controller.doStuff(); 

    } 
    }; 
}); 

如何嘲笑在d1指令的单元测试的d1controller控制器?


我尝试:

我试着用$provide嘲讽服务时为:

beforeEach(module('app', function ($provide) { 
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']); 
    $provide.value('d1controller', ctrlMock); 
    })); 

而且我也试图与$controllerProvider

beforeEach(module('app', function ($controllerProvider) { 
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']); 
    $controllerProvider.register('d1controller', ctrlMock); 
    })); 

回答

3

我是OP。事实证明,使用$controllerProvider的作品。你必须传递它一个构造函数;不是一个实例。

beforeEach(module('app', function ($controllerProvider) { 
    $controllerProvider.register('d1controller', function Mock(){ 
    this.doStuff = function(){}; 
    }); 
})); 
1

我有体面的运气创建一个模拟模块,其中包含我所有的模块cked服务/控制器,然后在我的应用程序模块之后包含该模拟模块。它基本上覆盖了你模拟模块中的所有服务/控制器。

创建你的模拟模块,你的控制器模拟该模块。

appMock = angular.module('appMock', []); 

appMock.controller('ControllerToMockCtrl', ['$scope', function($scope) { 
    $scope.greeting = 'Hola!'; 
}]); 

在你的测试中。

beforeEach(function(){ 
    module('app'); 
    module('appMock'); 
}); 

这个博客就是这个策略的一个很好的例子。 http://southdesign.de/blog/mock-angular-js-modules-for-test-di.html#using-the-mock

+0

好戏。我创建了一个'mockDirectiveController'帮手来隐藏实现细节。见https://gist.github.com/sylvain-hamel/9122684 – Sylvain

+0

看到我的新答案。 – Sylvain