给定一个具有外部控制器的指令:
.directive('d1', function () {
return {
controller: 'd1controller',
restrict: 'E',
link: function ($scope, $element, $attributes, $controller) {
$controller.doStuff();
}
};
});
如何在d1controller
指令的单元测试中模拟d1
控制器?
我的尝试:
在模拟服务时我尝试使用$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);
}));
答案 0 :(得分:3)
我是OP。事实证明,使用$controllerProvider
有效。你必须传递一个构造函数;不是一个实例。
beforeEach(module('app', function ($controllerProvider) {
$controllerProvider.register('d1controller', function Mock(){
this.doStuff = function(){};
});
}));
答案 1 :(得分:1)
我有一个不错的运气创建一个模拟模块,它包含我所有的模拟服务/控制器,然后在我的app模块之后包含那个模拟模块。它将基本上覆盖模拟模块中的所有服务/控制器。
创建你的模拟模块,你的控制器在那个模块中模拟。
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