首页 > 解决方案 > 确定 typescript 代码是否在 jasmine/karma 测试中运行的简单方法?

问题描述

我有一个静态方法来创建一个类似服务的对象,它可以通过静态方法访问,就像这样。

expect class FooService {
   private static instance : FooService;
   static getInstance() {
        if (!this.instance) {
           this.instance = new FooService();
        }
        return this.instance
  private constructor() {}
  [implementation]

}

我想做的是知道 getInstance() 是在我的 Angular 应用程序中运行,还是在单元测试中运行,所以我可以返回模拟版本而不是真实版本。

就像是:

 expect class FooService {
   private static instance : FooService;
   static getInstance() {
        if (isInJasmineTest()} {              <----
           return new MockFooService() 
        } 
        if (!this.instance) {
           this.instance = new FooService();
        }
        return this.instance
  private constructor() {}
  [implementation]

}

我知道间谍、模拟和注入有很多方法可以实现这一点,但是

我只是想知道如何实施 isInJasmineTest()

我想我可以编写某种在每个 Jasmine 测试的 beforeAll 中调用的函数,例如 setJasmineTestEnvironment(true) 但想知道是否已经存在一些东西我可以检查而不必创建这样的函数。

标签: typescript

解决方案


如果您使用 Karma 运行测试,以下内容可能会有所帮助。

由于 Karma 向 DOM 注入了一些东西来运行它的测试。你可以搜索那些的存在。

例如

document.getElementById('banner');注入主体顶部并显示您在所有 HTML 测试输出上方看到的 Karma 横幅。

const isKarma = document.getElementsByTagName("title")[0].innerHTML === 'Karma';

Karma 将页面标题设置为它自己的名称。因此,检查这也可能是一个可行的解决方案。

要从 a 访问 DOM,您需要注入它。

import { Injectable, Inject } from '@angular/core';
// We import DOCUMENT from @angular/common.
import { DOCUMENT } from '@angular/common';

constructor(@Inject(DOCUMENT) private document: HTMLDocument){}

this.document然后你可以像document在 Angular 组件中使用的那样对待


推荐阅读