Angular 2 – 模拟私有财产

前端之家收集整理的这篇文章主要介绍了Angular 2 – 模拟私有财产前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
虽然我理解测试代码的理想方式是以与生产相同的方式使用它,因此不直接处理私有属性方法TypeScript让我有点沮丧.

我有一个用户服务.

// user.service.ts
import {Injectable} from '@angular/core';
import {AppHttpService} from '../app-http/app-http.service'
@Injectable()
export class UserService {

  constructor(private appHttp: AppHttpService) {
  }
}

如图所示,它取决于具有私有属性方法的appHttp服务,让我们说如下所示:

// app-http.service.ts
@Injectable()
export class AppHttpService {
  private apiUrl     = 'my domain';
  constructor(private http: Http,private authHttp: AuthHttp) {
  }

  post(body): Observable<any> {
     return this.http.post(this.apiUrl,body)
        .map((res)=>res)
        .catch((err)=>null);
  }
}

为了对我的用户服务运行一个独立的测试,我想把它简单地模仿我的appHttp服务.不幸的是,如果我只是模拟公共方法,appHttp的属性并将其提供给我的构造函数,如下所示:

// user.service.spec.ts
describe('',() => {
  let appHttpMock = {
    post: jasmine.createSpy('post')
  };
  let service = new UserService(appHttpMock);
  beforeEach(() => {
  })
  it('',() => {
  })
})

我收到一个错误说明:

Error:(11,33) TS2345:Argument of type '{ post: Spy; }' is not assignable to parameter of type 'AppHttpService'.  Property 'apiUrl' is missing in type '{ post: Spy; }'.

如果我改变我的模拟只是添加属性我会得到另一个错误抱怨它不是私人的.如果我创建一个真实的模拟类,如:

// app-http.mock.ts
export class AppHttpMockService {
  private apiUrl     = 'my domain';

  constructor() {
  }

  post() {
  }
}

我还会得到另一个TypeScript错误

Error:(8,33) TS2345:Argument of type 'AppHttpMockService' is not assignable to parameter of type 'AppHttpService'. Types have separate declarations of a private property 'apiUrl'.

什么是运行隔离测试的简洁方法(即,不需要耗费时间创建测试平台的测试)没有TypeScript在模拟的私有属性方法上烦恼?

解决方法

在这种情况下,您可以使用接口:

export interface IAppHttpService  {post(body):Observable<any>;}

export class AppHttpService implements IAppHttpService { ... } 

export class UserService {
  constructor(@Inject(AppHttpService) private appHttp: IAppHttpService) {
  }
}

猜你在找的Angularjs相关文章