我使用控制器作为angular语法,我想使用jasmine和sinon测试我的代码。
假设我想要以下控制器代码:
angular
.module('Test')
.controller('TestController', TestController);
TestController.$inject = [];
function TestController() {
var viewModel = this;
viewModel.myFunction = myFunction;
function myFunction(){
//do something
//now call a helper function
helperFunction()
}
function helperFunction(){
// ....
}
}
我的问题是我怎么能测试helperFunction(),甚至把一个间谍吗?我的helper在我的测试中不可见。
下面是我的测试:
(function () {
'use strict';
var myController;
describe('Test', function () {
beforeEach(module('Test'));
beforeEach(inject(function ($controller, $injector) {
myController = $controller('TestController');
}));
it('Tests helperFunction', function (){
var sinonSpy = sinon.spy(myController, 'helperFunction');
//perform the action
myController.myFunction();
//expect the function was called - once
expect(sinonSpy .callCount).toEqual(1);
}
})
})
您不能访问这些函数。当你定义一个命名的JS函数时就相当于说:
var helperFunction = function(){};
在这种情况下,可以很清楚地看到var仅在块内的作用域中,并且没有来自包装控制器的外部引用。
要使一个函数可测试,你需要把它添加到控制器的$作用域。
viewModel.helperFunction = helperFunction;
但是请注意,仅仅为了使其可测试而暴露所有内容并不是一个好主意。你真的需要考虑测试它是否真的会给你的项目增加一些价值
尝试这样做:
var vm = controller("helperFunction", { $scope: scope });
然后:
vm.myFunction();
在控制器中添加以下代码:
angular.extend($scope, {
helperFunction:helperFunction
});