测试使用第三方库的服务

时间:2017-03-28 09:07:10

标签: angular jasmine karma-jasmine

我有Service使用名为client的库。

我加载的Client类存储在client的私有属性Service中。

对于我的规范,我无法像我这样在我的服务中注入mockClient

service = new Service(mockClient)

但我无法做到

service = new Service()
service.client = mockClient

因为client是私有的。

测试使用未注入且您想要模拟的第三方库的服务的正确做法是什么?

编辑: 我的服务使用像这样的第三方库

import { Client } from 'someLib';

Injectable()
export class Service {
  private client: Client;

  constructor() {
    this.client = new Client();
  }

1 个答案:

答案 0 :(得分:0)

这里的正确做法是重构您的代码,以便注入您的第三方库。首先,您应该将库包装在服务或工厂中。作为奖励,您可能只想公开您正在使用的第三方库的部分。您可以验证服务中的参数并对其进行转换,以使呼叫签名对您的应用有意义。所以,它可能看起来像这样:

app.service('theirLibraryFactory', () => {
 return {
   createClientWrapper: () => {
      let client = new Client();
      return {
        op1: (args) => client.doOp1(args),
        op2: (args) => client.doOp2(args)
        ...
      }
 };  
}

使用此客户端包装器,您可以将其注入到类中,然后模拟它。

ps-我知道 angualarjs提供工厂作为基本类型,但我更喜欢使用服务,因为他们做工厂所做的一切,但更明确。 YMMV。