我在单元测试中遇到了AngularJS观察者的问题。
当运行应用程序时,它正在按预期工作,但在单元测试中,oldValue总是等于newValue,这导致在测试者中测试这些值之间的不等时导致测试失败(我认为这是常见的)。
我做了一点点说明:http://plnkr.co/edit/a5er4f?p=preview 看一下控制台,观察行为。 在index.html,普通模式下,一切都很好,oldValue总是与newValue不同。 在Jasmine记者中,他们总是平等的。
对此有何想法?也许我在测试中做错了什么?
感谢您的帮助!
答案 0 :(得分:3)
您需要在测试中手动调用$scope.$apply()
以便观察者开火,否则他们不会检查值的变化,保持不变。
答案 1 :(得分:2)
有几件事正在发生:
首先:您正在使用$ controller在测试appSpec.js中实例化您的控制器,这是正确的。但是,您还使用<body ng-controller="WatchCtrl">
使用jasmine-reporter.html实例化控制器。两位观察者可能会搞砸您的测试。删除它,当你在它时,从html标记中删除ng-app =“testApp”。您需要使用angular.mock.module初始化您的应用程序。
第二:使用newVal == oldVal == null
初始化期间触发$ watch。请参阅$ watch的文档:http://docs.angularjs.org/api/ng。$ rootScope.Scope。所以你应该期待一个$ watch循环,其中newVal = oldVal每个控制器实例化。
另请注意,在测试中更改aValue时,您没有看到输出,因为作为测试运行时,$log
已被模拟。您可以切换到使用console.log
查看测试中的消息。
Plnkr进行了更改:http://plnkr.co/edit/voPQax?p=preview