gpt4 book ai didi

angular - 如何在 Angular 中不使用方法 stub 导入的模块?

转载 作者:太空狗 更新时间:2023-10-29 18:15:19 32 4
gpt4 key购买 nike

我有一个带有 Jasmine 测试框架的 Angular 应用程序。该应用程序有一个名为 AuthService 的服务,用于处理解码 JSON Web token :

auth.service.ts

import * as jwtDecode from 'jwt-decode';
...

@Injectable()
export class AuthService {
...
public getTokenPayload(token) {
return jwtDecode(token);
}
}

现在我想 stub 模块 jwtDecode 并在测试时返回一个假值:

auth.service.spec.ts

...

it('should get a token payload', () => {
const fakeToken = 'fake-token';

spyOn(service, 'getTokenPayload').and.callThrough();
const tokenPayload = service.getTokenPayload(fakeToken);

expect(tokenPayload).toBe('fake-token');
});

因为 'fake-token' 不是有效的 JSON Web Token,我的测试失败并显示消息:

InvalidTokenError: Invalid token specified: undefined is not an object (evaluating 'str.replace')

这可能是 jwt-decode 模块产生的错误,这是预期的。我不想为了测试目的而必须包含另一个模块来创建有效的 JSON Web token 。相反,我想 stub jwtDecode() 的功能。

我尝试过的

1。在 jwtDecode

上使用 spyOn

当我使用spyOn 时,我需要一个带有方法的对象。所以对于导入的 jwtDecode 这将不起作用,因为它本身就是一个函数:

spyOn(jwtDecode, '<method?>').and.callFake(() => 'fake-token');

2。在 getTokenPayload

上使用 callFake

我试过使用:

spyOn(service, 'getTokenPayload').and.callFake(() => 'fake-token');

...这样可以防止发生任何错误。但是,我的代码覆盖率报告现在显示未覆盖函数 getTokenPayload。此外,我在使用外部 NPM 模块的应用程序中还有其他功能,我不想忽略代码覆盖率,因为它们可能在应该测试的方法内部有其他实现。

3。在 jwtDecode

上使用 createSpy

我尝试覆盖导入的 jwtDecode 并创建一个 spy :

const jwtDecode = jasmine.createSpy('jwtDecode').and.returnValue('fake-token');

这给了我与上面相同的错误,表明 jwtDecode 没有在我实际的 AuthService 服务中被覆盖。

4。使用窗口作为对象

来自 this question我读到全局模块可能附加到 window 对象。因此,我尝试为 jwt-decode 做同样的事情:

在测试中...

console.log(window.jwtDecode); // undefined
console.log(window.jwt_decode); // undefined

不幸的是,这两个值在 window 对象上都是 undefined

问题

我想一般来说问题变成了:

如何 stub 导入的 NPM 模块?特别是,如果它们不是对象而是函数(没有在 Jasmine spyOn 中使用的方法),如何 stub ?

最佳答案

你非常接近!由于服务只是一个类,因此测试它的最佳方法是实例化一个新服务并监视它,就像您正在做的那样。如果你想监视导入的方法,你需要以某种方式将它包含在你的服务中。否则,您的测试无法知道该方法是什么。

所以在你的服务上有一个属性:

jwtDecode = jwtDecode; // the imported one

并在您的 getTokenPayload 方法中将其称为 this.jwtDecode

然后以下将起作用:

const service = new AuthService( /* constructor args */ );

const jwtDecode = spyOn(service, 'jwtDecode');
jwtDecode.and.returnValue('fake-token');

关于angular - 如何在 Angular 中不使用方法 stub 导入的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48478690/

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