2013-04-30 59 views
2

我在单元测试中遇到了AngularJS观察者的问题。AngularJS观察者:oldValue等于单元测试中的newValue

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

我已经做了一个小小的演示来说明:http://plnkr.co/edit/a5er4f?p=preview 看看控制台来观察行为。 在index.html中,正常模式下,一切正常,oldValue总是与newValue不同。在茉莉花记者,他们总是平等的。

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

感谢您的帮助!

回答

2

有两件事情是怎么回事:

第一条:您正在使用$控制器,这是正确的实例化控制器在您的测试appSpec.js。然而,你是用jasmine-reporter.html使用<body ng-controller="WatchCtrl">实例化一个控制器两个观察者可能搞砸了你的测试。删除它,当你在它的时候,从html标签中删除ng-app =“testApp”。你照顾用angular.mock.module初始化你的应用程序。

第二:在使用newVal == oldVal == null进行初始化时触发$ watch。请参阅$ watch的文档:http://docs.angularjs.org/api/ng。$ rootScope.Scope。所以你应该期待一个$ watch循环,其中每个控制器实例化的newVal = oldVal。

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

Plnkr与更改时间:。http://plnkr.co/edit/voPQax?p=preview

+0

嗨Jmr,非常感谢你的灯光。似乎你没有保存你的Plnkr,它仍然与原来的一样。 关于双声明,对不起,你是对的,但我可以在没有HTML的情况下在Karma运行的普通Jasmine测试中重现这一点。另外,在测试中实例化控制器的正确方法是什么?我一直都是这样看的,参见。官方文档:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller – 2013-04-30 23:10:32

+0

Plunkr已保存(更改主要在jasmine-reporter.html中) – Jmr 2013-04-30 23:18:41

+0

您正在使用$ beforeEach()中的$ controller服务。 – Jmr 2013-04-30 23:19:26

3

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

+2

他呼吁$范围$摘要()所以$范围$适用()不需要 – 2013-04-30 06:35:10

+0

感谢您的帮助,我其实都尝试但阿贾伊说,$ diggest应该足够了 – 2013-04-30 06:41:12

相关问题