确定typescript代码是否在jasmine/carma测试中运行的简单方法



我有一个静态方法来创建一个类似服务的对象,该对象由静态方法访问,类似这样。

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]

}

我知道有很多方法可以通过spy、mock和注入来实现这一点,但

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

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

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

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

例如

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

还有

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

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

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

import { Injectable, Inject } from '@angular/core';
// We import DOCUMENT from @angular/common.
import { DOCUMENT } from '@angular/common';
constructor(@Inject(DOCUMENT) private document: HTMLDocument){}

然后,您可以像在角度组件中通常使用的document一样处理this.document

最新更新