加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2 – 模拟私有财产

发布时间:2020-12-17 17:02:32 所属栏目:安全 来源:网络整理
导读:虽然我理解测试代码的理想方式是以与生产相同的方式使用它,因此不直接处理私有属性和方法TypeScript让我有点沮丧. 我有一个用户服务. // user.service.tsimport {Injectable} from '@angular/core';import {AppHttpService} from '../app-http/app-http.serv
虽然我理解测试代码的理想方式是以与生产相同的方式使用它,因此不直接处理私有属性和方法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) {
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读