在 Angular 11 中进行单元测试时,将 json 对象转换为 typescript 接口导致模拟对象出错

Posted

技术标签:

【中文标题】在 Angular 11 中进行单元测试时,将 json 对象转换为 typescript 接口导致模拟对象出错【英文标题】:Converting json object to typescript interface causing error in the mock object while unit testing in Angular 11 【发布时间】:2021-06-11 18:21:50 【问题描述】:

我在 Angular 11 应用程序中收到一个 json 响应,并且我创建了一个与该 json 对象对应的接口。 json对象是


  "division": 
      "uid": "f5a10d90-60d6-4937-b917-1d809bd180b4",
      "name": "Sales Division",
      "title": "Sales",
      "type": "Form",
      "formFields": [
          
              "id": 1,
              "name": "firstName",
              "label": "First Name",
              "value": "John"
          ,
          
              "id": 2,
              "name": "lastName",
              "label": "Last Name",
              "value": "Smith"
          
      ]
   

我为这个 json 对象创建的 typescript 接口是

export interface FormField 
   id: number;
   name: string;
   label: string;
   value: string;


export interface Division 
   uid: string;
   name: string;
   title: string;
   type: string;
   formFields: FormField[];


export interface Division 
   division: Division;

我正在使用服务 division.sevice.ts 从 API 获取上述 json 响应,一切正常。我正在尝试在 division.service.spec.ts 文件中为此服务编写单元测试。我在这个文件中创建了一个 mockDivisionObj 用于测试目的,如下所示。

mockDivisionObj = 
  "division": 
      "uid": "f5a10d90-60d6-4937-b917-1d809bd180b4",
      "name": "Sales Division",
      "title": "Sales",
      "type": "Form",
      "formFields": [
          
              "id": 1,
              "name": "firstName",
              "label": "First Name",
              "value": "John"
          ,
          
              "id": 2,
              "name": "lastName",
              "label": "Last Name",
              "value": "Smith"
          
      ]
  

显示一个错误提示

Property 'division' is missing in type ' uid: string; name: string; title: string; type: 
string; formFields:  id: number; name: string; label: string; value: string; []; ' but 
required in type 'Division'.

我认为我创建界面的方式可能是错误的,但我无法弄清楚究竟是什么导致了这个问题。请帮我解决这个问题。

【问题讨论】:

你有两个接口,命名为division? 是的,但是当我将最后声明的接口名称更改为“AppDivision”时,在我的实际组件中,我收到错误“Division”类型中缺少属性“division”但在“AppDivision”类型中是必需的 我认为这段代码甚至不会编译,因为不可能定义两个具有相同名称的类型。你需要先解决这个问题。 即使我们在一个文件中有两个同名的接口,代码仍然可以编译,因为我的主要功能正常工作。但是为了解决上述问题,我将一个接口的名称更改为“AppDivision”,并修复了我上面提到的组件中的错误。 @suvenk 你可以查看我的答案。我认为您不需要名为AppDivision 的额外接口。最美好的祝愿:-) 【参考方案1】:

我能够通过将文件中的一个接口的名称更改为“AppDivision”来解决此问题,如下所示。

export interface FormField 
   id: number;
   name: string;
   label: string;
   value: string;


export interface Division 
   uid: string;
   name: string;
   title: string;
   type: string;
   formFields: FormField[];


export interface AppDivision 
   division: Division;

两个接口同名导致单元测试mock对象出错。

【讨论】:

你可以查看我的答案。我认为您不需要名为AppDivision 的额外接口。最美好的祝愿:-)【参考方案2】:

您的代码很好。要解决此错误,您可以尝试以下代码 =>

  this.division = this.mockDivisionObj.division as Division;

查看链接: StackBlitz Demo link。

【讨论】:

以上是关于在 Angular 11 中进行单元测试时,将 json 对象转换为 typescript 接口导致模拟对象出错的主要内容,如果未能解决你的问题,请参考以下文章

Angular 11 单元测试代码覆盖率现已突破

如何使用输入对 Angular 指令进行单元测试?

如何在 Angular Ag Grid 中测试 AgRendererComponent 组件

在 Angular 中使用 Jasmine 使用 *ngIf 指令时,如何对元素是不是可见进行单元测试

将 Angular 单元测试报告导入 Sonarqube

单元测试 queryParams 订阅 (Angular5)