我有以下简单的服务
app.factory('Shoes', function() {
function a() {return 12;}
function b() {return a();}
return {
a: a,
b: b
}
})
我想在调用方法b
时测试方法a
是否被调用。我的测试看起来像这样:
describe('Testing a Shoes service', function() {
var service;
beforeEach(module('plunker'));
beforeEach(inject(function(Shoes) {
service = Shoes;
}))
it('.b should call .a', function() {
spyOn(service, 'a');
service.b();
expect(service.a).toHaveBeenCalled();
})
});
但是测试失败了。相关的 plunker 是 here .我已经知道如何解决来自 those answers 的 plunker 中的问题.还有一个 Unresolved 问题:
为什么原始函数对象没有被解析?
我认为系统是这样工作的(假设 spy 用额外的逻辑装饰函数)
当我调用 service.a
时没有 spy ,它被解析为:
A) service.a -> a()
当我创建一个 spy 时,它会装饰函数
B) spy -> service.a => service.a*()
但是 service.a
基本上是对原始 a()
的引用,所以我们最后应该有一个用于解析函数对象的 spy 集:
A + B => spy -> service.a -> a => a*()
最佳答案
调用 spyOn(service, 'a')
后,service.a
不再是您在函数中定义的 a
- - 这是一个 spy 功能。那个 spy 函数恰好调用了a
,但它不是a
;它具有不同的身份和不同的功能。
但是,设置 service
的 a
属性不会更改您在 app.factory
中声明的 functiona
>。您只是更改了 service
,使其 a
属性不再引用您原来的 a
。相比之下,您的 b
函数永远不会更改其对原始 a
的引用。它直接从本地 app.factory
作用域获取 a
,a
和 b
最初是在该作用域中声明的。 service
用 spy 替换它原来的 a
的事实并不影响 b
对 a()
的调用,因为它不引用 service.a
。
关于javascript - 为什么 jasmine spy 不通过引用解析函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222909/