好的,所以我一直在绊倒一些问题很长时间,我想听听社会其他人的意见。
首先,让我们来看一些抽象控制器。
function Ctrl($scope,anyService) { $scope.field = "field"; $scope.whenClicked = function() { util(); }; function util() { anyService.doSmth(); } }
显然我们在这里:
>控制器的常规支架与$范围和一些服务注入
>一些字段和函数附加到作用域
> private方法util()
现在,我想在单元测试(Jasmine)中覆盖这个类。然而,问题是,我想验证当我点击(调用whenClicked())一些项目,util()方法将被调用。我不知道该怎么做,因为在Jasmine测试中,我总是得到的错误,或者mock为util()没有被定义或没有被调用。
注意:我不是试图修复这个特殊的例子,我问一般测试这样的代码模式。所以请不要告诉我“什么是确切的错误”。我问如何做到这一点,而不是如何解决这个问题。
我一直在尝试一些方法围绕这个:
>显然我不能在我的单元测试中使用$ scope,因为我没有这个功能附加到这个对象(它通常以消息预期间谍结束,但未定义或类似)
>我尝试通过Ctrl.util = util将这些函数附加到控制器对象;然后验证mock像Ctrl.util = jasmine.createSpy(),但在这种情况下,Ctrl.util不被调用,因此测试失败
>我试图改变util()附加到这个对象,并再次嘲笑Ctrl.util,没有运气
好吧,我找不到我的方式,我会期待一些帮助从JS忍者,一个工作的小提琴将是完美的。
命名空间的范围是污染。你想要做的是将该逻辑提取到一个单独的函数,然后注入到你的控制器。即:
function Ctrl($scope,util) { $scope.field = "field"; $scope.whenClicked = function() { util(); }; } angular.module("foo",[]) .service("anyService",function(...){...}) .factory("util",function(anyService) { return function() { anyService.doSmth(); }; });
现在你可以单元测试嘲笑你的Ctrl以及“util”。