2014-02-20 57 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