2

我在单元测试中遇到了 AngularJS 观察者的问题。

运行应用程序时,它按预期工作,但在单元测试中,oldValue 始终等于 newValue,这导致在观察者中测试这些值之间的不等性时测试失败(我认为这很常见)。

我做了一点 plunkr 来说明:http ://plnkr.co/edit/a5er4f?p=preview 看看控制台观察行为。在 index.html 中,普通模式,一切都很好,oldValue 总是与 newValue 不同。在茉莉花记者中,他们永远是平等的。

对此有什么想法吗?也许我在测试中做错了什么?

谢谢你的帮助!

4

2 回答 2

3

您需要$scope.$apply()在测试中手动调用观察者触发,否则他们不会检查值更改,保持不变。

于 2013-04-30T06:29:34.873 回答
2

有几件事正在发生:

首先:您正在使用 $controller 在测试 appSpec.js 中实例化您的控制器,这是正确的。但是,您使用 jasmine-reporter.html 实例化了一个控制器,<body ng-controller="WatchCtrl">这两个观察者可能搞砸了您的测试。删除它,当您使用它时,从 html 标记中删除 ng-app="testApp" 。您负责使用 angular.mock.module 初始化您的应用程序。

第二: $watch 在初始化期间触发newVal == oldVal == null. 在此处查看 $watch 的文档:http: //docs.angularjs.org/api/ng .$rootScope.Scope。所以你应该期待一个 $watch 循环,其中 newVal = oldVal 每个控制器实例化。

另请注意,当您在测试中更改 aValue 时,您看不到输出,因为在作为测试运行时,$log已被模拟出来。您可以切换到使用console.log来查看来自测试的消息。

Plnkr 进行了更改:http ://plnkr.co/edit/voPQax?p=preview

于 2013-04-30T22:40:02.877 回答