角度单元测试:如何在没有范围的情况下测试控制器属性
Angular unit testing: how to test controller properties without scope
我正试图为控制器编写一些测试,但所有关于这方面的文档/教程等都用$scope上的函数和变量进行了演示。如果你想测试一些不在$scope上的东西怎么办?
例如:
app.controller('fakeCtrl', function($scope) {
var foo = 'bar';
function fooBar() {
console.log('foo bar');
}
});
有没有办法对foo
或fooBar()
进行单元测试?
以下是不起作用的:
describe("fake controller", function(){
beforeEach(module('app'));
var $controller;
beforeEach(inject(function(_$controller_, $rootScope){
$controller = _$controller_;
$scope = $rootScope.$new();
}));
describe('foo property', function() {
it('is bar', function() {
var controller = $controller('fakeCtrl', { $scope: $scope });
expect(controller.foo).toEqual('bar');
});
});
...
您不能。变量foo
和函数fooBar
在控制器构造函数的作用域之外是不可访问的。然而,你可以这样做:
app.controller('fakeCtrl', function($scope) {
this.foo = 'bar';
this.fooBar() {
console.log('foo bar');
}
});
以及:
(...)
describe('foo property', function() {
it('is bar', function() {
var controller = $controller('fakeCtrl', { $scope: $scope });
expect(controller.foo).toEqual('bar');
});
});
在测试中,您将foo
描述为一个属性,但在控制器中,foo
只是变量而不是属性。
编辑:检查https://docs.angularjs.org/api/ng/directive/ngController以及CCD_ 7语法。
javascript中没有办法从外部范围访问本地(在函数内部声明)函数或变量。你有一些选择来测试这个:
- 声明作用域上的函数/变量
- 将函数/变量移动到角度服务并测试该服务
- 通过在使用该函数/值的范围上测试方法,间接测试函数/变量
我更喜欢将这样的函数/变量移动到角度服务,但这取决于它们的用途。
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- AngularJS绑定没有'在没有填充父范围的情况下无法工作
- 角度单元测试:如何在没有范围的情况下测试控制器属性
- 让 javascript 将(默认情况下)未声明的变量声明到当前本地范围(基于首次使用)而不是全局范围
- AngularJS:如何在不通过多个$parent导航的情况下访问最顶层的范围
- 为什么JavaScript在第二种情况下不查找全局范围
- 如何在不覆盖父范围的情况下将参数传递给指令
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 如何在不重复的情况下将一个范围中定义的函数添加到另一个范围
- 如何在不重新绘制绑定视图的情况下重新加载angularjs范围数据
- Dart HTML-在不释放鼠标按钮的情况下更改输入范围
- 我如何在不使用范围声明的情况下切换指令
- 在我的情况下,如何将数据从指令传递到父范围
- 如何在不使用Jquery UI的情况下动态移动HTML5范围的输入句柄
- HighStock -在不使用range选择器的情况下将范围设置为超过2小时
- 如何在不修改全局范围的情况下执行某些javascript
- 在不使用 ng-bind-html 的情况下在范围变量中绑定 html 内容