好的,我一直遇到一些问题,希望听听社区的意见。
首先,让我们来看一下某个抽象控制器。
function Ctrl($scope, anyService) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
function util() {
anyService.doSmth();
}
}
很明显,这里有:
- 一个带有
$scope
和一些服务注入的控制器常规脚手架 - 一些字段和函数附加到作用域上
- 私有方法
util()
现在,我想用单元测试(Jasmine)覆盖这个类。然而,问题是我想验证当我点击(调用whenClicked()
)某个项目时,util()
方法将被调用。我不知道如何做到这一点,因为在Jasmine测试中,我总是得到错误提示,要么是未定义或未调用util()
的模拟对象。
注意:我不是要解决这个特定例子,我在询问如何在一般情况下测试此类代码。所以请不要告诉我"具体错误是什么"。我在问如何做到这一点,而不是如何修复它。
我尝试了许多方法:
- 很明显,我不能在我的单元测试中使用
$scope
,因为我没有将此函数附加到该对象上(通常会出现类似于“期望间谍但得到未定义”等消息) - 我尝试通过
Ctrl.util = util;
将这些函数附加到控制器对象上,然后像Ctrl.util = jasmine.createSpy()
这样验证模拟对象,但在这种情况下,Ctrl.util
没有被调用,所以测试失败了 - 我尝试将
util()
更改为附加到this
对象,并再次模拟Ctrl.util
,但没有成功
好的,我找不到解决方法,我希望得到一些JS Ninjas(JavaScript高手)的帮助,一个可工作的fiddle(指代码测试网站)会非常完美。
this.util
非常适合模拟目的,不是吗?问题出在哪里? - ey dee ey emthis
中会使其在视图中可用,这违背了将其设置为私有的目的。 - d512