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

Javascript AngularJS观察者:单元测试中的oldValue等于newValue,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我在单元测试中遇到了AngularJS观察者的问题 当运行应用程序时,它按预期工作,但在单元测试中,oldValue总是等于newValue,这导致在watchers中测试这些值之间的不相等时测试失败(我认为这很常见) 为了说明这一点,我做了一个小插曲: 查看控制台以观察其行为。 在index.html的正常模式下,一切正常,oldValue总是与newValue不同。 在《茉莉花记者》中,他们总是平等的 有什么想法吗?也许我在考试中做错了什么 谢谢你的帮助 您需要在测试中手动调用$scope.

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

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

为了说明这一点,我做了一个小插曲: 查看控制台以观察其行为。 在index.html的正常模式下,一切正常,oldValue总是与newValue不同。 在《茉莉花记者》中,他们总是平等的

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


谢谢你的帮助

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

发生了一些事情:

首先:您正在使用$controller在测试appSpec.js中实例化控制器,这是正确的。然而,您也在使用
用jasmine-reporter.html实例化一个控制器,这两个观察者可能会把您的测试搞砸。删除该标记,然后在执行此操作时,从html标记中删除ng app=“testApp”。您可以使用angular.mock.module初始化应用程序

第二:$watch在初始化过程中用
newVal==oldVal==null
触发。请参阅此处$watch的文档:.$rootScope.Scope。因此,您应该期望每个控制器实例化一个$watch循环,其中newVal=oldVal

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


修改后的Plnkr:

他正在调用$scope。$digest()所以$scope。$apply()不需要。谢谢你的帮助,我实际上已经尝试了这两种方法,但正如Ajay所说,$diggest应该足够高了。Jmr,非常感谢你的帮助。似乎你还没有保存你的Plnkr,它仍然是原来的一样。关于双重声明,很抱歉,你是对的,但是我可以在Karma运行的普通Jasmine测试中,在没有HTML的情况下复制这个。另外,在测试中实例化控制器的正确方法是什么?我一直这样认为,参见官方文档:Plunkr已保存(更改主要在jasmine reporter.html中),您正在使用beforeach()中的$controller服务以正确的方式实例化控制器。抱歉,我读到了“不正确”。我也用预期输出(在appspec中)更新了我的,如果我错了,请告诉我。在将
scope.aValue
更改为测试之前,我将查看一下您是否必须添加另一个
scope.$digest()
。然后它将使用
null
初始化,而不是使用
test
初始化。编辑的plnkr: