好了,所以我很久以来一直在某个问题上绊脚石,我想听听社区其他成员的意见。
首先,让我们看一些抽象控制器。
function Ctrl($scope, anyService) { $scope.field = "field"; $scope.whenClicked = function() { util(); }; function util() { anyService.doSmth(); } }
显然,我们在这里:
$scope
util()
现在,我想在单元测试(Jasmine)中介绍此类。但是,问题是我想验证单击(调用whenClicked())某项时该util()方法将被调用。我不知道该怎么做,因为在Jasmine测试中,我总是会收到错误,指出util()尚未定义模拟或未调用模拟。
whenClicked()
注意:我不是要修复这个特定的示例,而是询问有关一般测试这种代码模式的问题。 因此,请不要告诉我“什么是确切的错误”。我在问如何做到这一点,而不是如何解决这个问题。
我一直在尝试多种解决方法:
Expected spy but got undefined
Ctrl.util = util;
Ctrl.util = jasmine.createSpy()
Ctrl.util
this
好吧,我无法找到解决方法,我希望JS忍者会提供一些帮助,一个有用的小提琴将是完美的。
在范围上命名是污染。您要做的是将该逻辑提取到一个单独的函数中,然后将其注入您的Controller中。即
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” 模拟单元测试。