【问题标题】:How to test TypeScript abstract class with Jasmine如何使用 Jasmine 测试 TypeScript 抽象类
【发布时间】:2017-08-16 13:41:23
【问题描述】:

我有一个非常简单的抽象类,我在 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. 
        }); 
}

我想知道如何编写一个基本的独立单元测试来检查上面的类是否可以实现以及它的单个方法是否被调用。我知道我必须以某种方式模拟类的实现,但我不确定如何去做。

【问题讨论】:

  • 您想进行什么样的测试?展示具体的测试用例
  • 我已经更新了实现(见上文)
  • 你删除了你的评论吗?
  • 不,我只是将实现移至原始问题。往上看。
  • 你无法测试抽象类是否可以实现……你甚至无法测试类是否是抽象的,因为测试在 JavaScript 上运行而 JavaScript 没有抽象类跨度>

标签: angular typescript testing jasmine


【解决方案1】:

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

沿着这些思路有几种方法:

  1. 您的DefaultLayoutGeneratorService 中已经有一个实现,因此您也可以利用它作为您的模拟实现,尤其是与spyOn 结合使用,例如:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多