angular - 如何使用 Jasmine 测试 TypeScript 抽象类

标签 angular typescript testing jasmine

我在 Angular 服务中实现了一个非常简单的抽象类。我正在尝试为其编写一些测试,但在 Jasmine 文档中找不到有关测试抽象类的任何信息。

import { Page } from '../models/index';

import { Observable } from 'rxjs/Observable';

export abstract class ILayoutGeneratorService {
  abstract generateTemplate(page: Page, deviceType: string ): Observable<string>;
}

抽象类实现如下:

export class DefaultLayoutGeneratorService implements ILayoutGeneratorService { 
      generateTemplate(page: Page, deviceType: string): Observable<string> { 
        return Observable.create((observer: any) => {
           // do something with result. 
        }); 
}

我想知道我将如何编写一个基本的隔离单元测试来检查上面的类是否可以实现并调用它的单个方法。我知道我将不得不以某种方式模拟该类的实现,但我不太确定该怎么做。

最佳答案

我不知道有一种方法可以在 TypeScript 中自动删除抽象类的实现。如果你找到了,那是一个不错的选择。但是对于 spyOn 和相关行为,Jasmine 至少可以提供帮助。

沿着这些思路的几个方法:

  1. 您已经在 DefaultLayoutGeneratorService 中实现了一个实现,因此您也可以将其用作模拟实现,尤其是与 spyOn 结合使用时,例如:

    let defaultLayoutGeneratorService = new DefaultLayoutGeneratorService();
    spyOn(defaultLayoutGeneratorService, 'generateTemplate');
    

    如果您需要测试几个特定的​​输出,您可以将其与 .and.returnValue 一起使用,例如:

    spyOn(...).and.returnValue(Observable.of('hello'));
    
  2. 或者您可以实现一个单独的模拟。 (可能是因为 DefaultLayoutGeneratorService 很难实例化,或者只是解耦。)如果你想测试特定的输出或只是将测试逻辑与 mock 解耦,你仍然可以使用 spyOn如上。

然后调用各种方法进行测试,如mock.generateTemplate(page, deviceType)。并包括您需要的任何额外检查,可能利用 Jasmine 的 expect

关于angular - 如何使用 Jasmine 测试 TypeScript 抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45715242/

相关文章:

typescript - 通过 nrwl nx 在 cypress 中使用 .feature 文件

ajax - 如何为 Apache Wicket 单选按钮测试 AjaxEventBehavior ("onClick")?

angular - 来自 Angular Route Guard 的 Web Api 调用

angular2自定义表单输入无法读取未定义的属性 'name'

mysql - MySQL 数据库中的日期未显示在 Angular View 中

javascript - 无法捕获从 Angular 4 中的子组件发出的事件

testing - 测试多用户桌面应用程序的策略

node.js - Mocha 只运行一个测试

javascript - 如何删除呈现的 html 中的路由器导出标签?

angular - mat-form-field Angular Material 中有多个输入