typescript - 确定 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) 但想知道是否已经存在一些东西我可以检查而不必创建这样的函数。
解决方案
如果您使用 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 组件中使用的那样对待
推荐阅读
- javascript - 错误:无法在“节点”上执行“appendChild”:文档上只允许一个元素
- ios - SpriteKit Swift:SKView 返回 nil
- asp.net-web-api - Web API Post Type 操作没有被 jquery ajax 调用
- python - 简单标题的 Django 匹配 URL
- swift - 快速加载嵌套的xib
- c - 如何在 C 中使函数“可扩展”?
- c++ - 为什么文本呈现为四边形?
- python - Google Cloud Speech-to-Text API - 无限等待
- mysql - 比较 MySQL 中的两个时间戳
- python - 对象检测上的 Python&OpenCv TypeError