我有一个静态方法来创建一个类似服务的对象,该对象由静态方法访问,类似这样。
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