我有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();
}
答案 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。