如何在Jasmine中测试$scope.watch(AngularJS)的变化?

38

我最近刚开始用AngularJS写东西,但不确定如何为此特定部分编写测试。我正在构建一个具有不同状态的“帮助请求”模式。因此,在我的控制器中,我使用了 $scope.request_mode 变量。不同的链接激活帮助请求时,将该变量设置为不同的值。

然后在我的指令内部,我使用 $scope.$watch('request_mode', function(){...}); 以选择性地激活或停用随着请求模式更改而变化的东西。代码都很好,但我遇到的问题是测试方面的。我似乎无法让Jasmine捕获 $scope.$watch 并在其更改时实际触发任何内容。

我相信有人之前也遇到过这个问题,所以非常感激任何建议。


2
你目前尝试了什么?你是否有一些现有的测试代码我们可以查看? - Michelle Tilley
1个回答

97
在您的单元测试中,您需要手动调用 $scope.$digest()$scope.$apply() 来触发 $scope.$watch()
通常在代码编写中,您不需要这样做,因为像 ng-click 这样的指令会在幕后为您执行 $rootScope.$apply

3
scope.$apply() 对我有效。 - Anonymous
3
$apply需要调用两次吗?即在更改被监视值之前需要调用一次,在更改后需要再次调用一次,否则我的期望就是错误的。我找不到有人调用两次的例子。 - nymo
3
是的,在我的其中一个测试中,我也需要调用它两次。 - Volker Rose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接