gpt4 book ai didi

javascript - 测试 Angular 服务内部方法调用

转载 作者:行者123 更新时间:2023-11-28 18:40:14 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();
})

});

但是测试失败了。相关的骗子是here .

问题是如何测试这种交互?

最佳答案

这里发生的情况是,您在 service.a 方法上设置了 spy ,但内部 a (由 b 内部调用) >) 仍然是相同的内部方法(即不是 spy ),这就是您的测试失败的原因。

如果你真的想这样做,唯一的方法是不调用内部 a 而是调用你的服务的方法:

app.factory('Shoes', function() {
return {
a: function a() {
return 12;
},

b: function b() {
return this.a();
}
 };
});

这是您的 plunkr 的更新:https://plnkr.co/edit/6FZptdcX9qwyOE6kbgAX

编辑:

只是一些解释:service.a 方法只是指向内部 a 方法的指针。当您说 spyOn(service, 'a') 时,您只是覆盖了 service.a 指针以指向完全不同的方法(即由 jasmine 创建的 spy ) 。内部 a 方法是私有(private)的,永远不会更新,因此如果您在内部 b 方法中调用 a(),则只需调用原始方法a不是service.a指向的spy。

关于javascript - 测试 Angular 服务内部方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222079/

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