gpt4 book ai didi

javascript - 为什么 jasmine spy 不通过引用解析函数对象?

转载 作者:行者123 更新时间:2023-11-30 12:02:48 25 4
gpt4 key购买 nike

我有以下简单的服务

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;它具有不同的身份和不同的功能。

但是,设置 servicea 属性不会更改您在 app.factory 中声明的 functiona >。您只是更改了 service,使其 a 属性不再引用您原来的 a。相比之下,您的 b 函数永远不会更改其对原始 a 的引用。它直接从本地 app.factory 作用域获取 aab 最初是在该作用域中声明的。 service 用 spy 替换它原来的 a 的事实并不影响 ba() 的调用,因为它不引用 service.a

关于javascript - 为什么 jasmine spy 不通过引用解析函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com