gpt4 book ai didi

Angular2 Jasmine SpyOn 方法不存在

转载 作者:太空狗 更新时间:2023-10-29 17:29:51 30 4
gpt4 key购买 nike

我定义了一个接口(interface)和不透明的token如下

export let AUTH_SERVICE = new OpaqueToken('auth.service');

export interface AuthService {
logIn(): void;
logOut(): void;
}

在我的测试类中,我提供了一个 stub 版本的AuthService,即

@Injectable()
class AuthServiceStub implements AuthService {
logIn(): void {}
logOut(): void {}
}

并如下设置我的测试beforeEach

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LoginComponent ],
providers: [
{provide: AUTH_SERVICE, useValue: AuthServiceStub}
]
});
}));

然后我开始写测试,即

it('should call log in on AuthService', () => {
let authService = fixture.debugElement.injector.get(AUTH_SERVICE);
spyOn(authService, 'logIn');
// expect will go here
});

但我得到以下错误

 Error: <spyOn> : logIn() method does not exist

看不出我做错了什么。有什么想法吗?

最佳答案

那是因为您在提供者对象中使用了 useValue 属性。这意味着注入(inject)的值将是 AuthServiceStub 类本身。相反,您想要的是实际具有这些方法的实例。

要使测试有效,请将 useValue 替换为 useClass。这将使 Angular 的依赖注入(inject)系统在创建提供者时实际实例化服务,并且您的调用 fixture.debugElement.injector.get(AUTH_SERVICE); 将返回一个正确的对象。

或者,您可以手动实例化该类:

it('should call log in on AuthService', () => {
let AuthService = fixture.debugElement.injector.get(AUTH_SERVICE);
let authService = new AuthService();
spyOn(authService, 'logIn');
// expect will go here
});

不过,useClass 是更好的解决方案,因为它将处理 AuthService 可能需要的所有 future 注入(inject)。

关于Angular2 Jasmine SpyOn 方法不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42401618/

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