AngularJS观察者:oldValue在单元测试中等于newValue

时间:2013-04-30 05:52:13

标签: javascript angularjs jasmine

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

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

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

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

感谢您的帮助!

2 个答案:

答案 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