【问题标题】:Using Jasmine to spy on a private function in an AngularJS service使用 Jasmine 监视 AngularJS 服务中的私有函数
【发布时间】:2013-11-26 20:35:07
【问题描述】:

我有一个工厂 myFactory 有一个私有函数 foo 该工厂返回一个具有两个属性的对象:foo - 设置为私有函数,foo_alias 设置为 function(){ foo() }

我正在尝试使用 Jasmine Spies 通过 spyOn(myFactory, 'foo') 监视私有函数 foo 并查看它是否是通过 foo_alias 调用的。我想既然一切都指向原始私有函数foo,调用别名应该触发间谍——即expect(myFactory.foo).toHaveBeenCalled(),但这不起作用。

显示此问题的 plunkr 在这里:http://plnkr.co/edit/i032kHYToe5sGml0Mnqn?p=preview

非常感谢您对此的帮助以及通过别名测试私有函数的任何建议。具体来说,我有一堆方便的方法,我想确保它们使用正确的参数调用内部函数。

【问题讨论】:

    标签: javascript unit-testing angularjs testing jasmine


    【解决方案1】:

    要实现你想要的,你只需要让foo_alias调用this.foo()

    原因是在调用 spyOn() 之后,myFactory.foo 已经被包装函数包装和替换,即myFactory.foo === wrapped_fn。 jasmine 使用“wrapped_fn”来“监视”函数。但是,myFactory.foo_alias 仍在调用原始的foo(),而不是被监视的函数。因此,expect(myFactory.foo).toHaveBeenCalled() 会引发错误。

    如果您将foo_alias 改为调用this.foo(),它将调用正确版本的myFactory.foo()

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      相关资源
      最近更新 更多