Angular 测试使用第三方库的服务
我有一个Angular 测试使用第三方库的服务,angular,jasmine,karma-jasmine,Angular,Jasmine,Karma Jasmine,我有一个服务,它使用一个名为client的库 我加载的Client类存储在Service的私有属性Client中 对于我的规范,我不能像这样在我的服务中注入mockClient service = new Service(mockClient) import { Client } from 'someLib'; Injectable() export class Service { private client: Client; constructor() { this.c
服务
,它使用一个名为client
的库
我加载的Client
类存储在Service
的私有属性Client
中
对于我的规范,我不能像这样在我的服务中注入mockClient
service = new Service(mockClient)
import { Client } from 'someLib';
Injectable()
export class Service {
private client: Client;
constructor() {
this.client = new Client();
}
但我也做不到
service = new Service()
service.client = mockClient
因为客户端
是私有的
测试使用第三方库的服务时,正确的做法是什么?该第三方库不是注入的,而是您想要模拟的
编辑:
我的服务使用这样的第三方库
service = new Service(mockClient)
import { Client } from 'someLib';
Injectable()
export class Service {
private client: Client;
constructor() {
this.client = new Client();
}
这里正确的做法是重构代码,以便注入第三方库。首先,您应该将库包装在服务或工厂中。作为奖励,您可能只想公开您正在使用的第三方库的部分。您可以验证服务中的参数并对其进行转换,以使呼叫签名对您的应用程序有意义。所以,它可能看起来像这样:
app.service('theirLibraryFactory', () => {
return {
createClientWrapper: () => {
let client = new Client();
return {
op1: (args) => client.doOp1(args),
op2: (args) => client.doOp2(args)
...
}
};
}
使用这个客户机包装器,您可以将它注入到类中,然后模拟它
ps-我知道angualarjs提供工厂作为基本类型,但我更喜欢使用服务,因为它们做工厂做的一切,但更明确。YMMV.你能举一个不那么抽象的例子吗?为什么你不能用DI来提供一个模拟呢?我用服务类编辑了我的帖子。我不能使用DI,因为第三方库没有被注入。你可以重构它,让它被注入,这样测试就更容易了。