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,因为第三方库没有被注入。你可以重构它,让它被注入,这样测试就更容易了。