【问题标题】:How to globally mock an Angular service for Jasmine如何全局模拟 Jasmine 的 Angular 服务
【发布时间】:2020-10-16 15:37:59
【问题描述】:

我已将浏览器的控制台对象配置为 Angular 服务,这样我就可以将其注入到其他服务中,如下所示:

export const CONSOLE = new InjectionToken<Console>('Console', {
  providedIn: 'root',
  factory: () => console
});

不过,在 Jasmine 测试中,我想注入此服务的模拟版本,以便我的 Jasmine 测试代码不会开始将间谍附加到实际的 console 对象(因为我不确定它们是否会自动在测试结束时分离,因为服务 - 即底层 console 对象 - 永远不会被破坏)。

我可以在描述块的开头这样做,即:

beforeEach(() => {
  const console = {
    error: () => {
    }
  };

  TestBed.configureTestingModule({
    providers: [
      {provide: CONSOLE, useValue: console}
    ]
  });
});

但是,我不想在每个测试文件中都这样做。

有什么方法可以在标准 Angular CLI 项目中定义一个全局 beforeEach(),它将在我所有的 Jasmine 测试之前运行? 我该怎么做?我应该把它放在哪里?

【问题讨论】:

  • 在每个测试文件中导入ConsoleTestModule是否适用于你?
  • 是的,我认为这可行 - 请参阅 @AliF50 的解决方案。如果可能的话,我仍然更喜欢全局 beforeEach(),所以我不必每次都导入它。

标签: angular jasmine


【解决方案1】:

虽然这是一个微小的改进,但您可以将模拟提供程序偏移到一个模块中。

TestModuleForAll.ts

import { NgModule } from '@angular/core';
const console = {
    error: () => {
    }
  };
@NgModule({
  imports:      [ ],
  providers:    [ {provide: CONSOLE, useValue: console} ],
})
export class TestModuleForAll{ }

然后将此模块放入您的importsTestBed.configureTestingModule数组中

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [TestModuleForAll],
    providers: []
  });
});

【讨论】:

  • 这是个好主意。我对 Angular 还是很陌生,没想过要写一个测试模块。如果可能的话,我仍然希望能够做一个全球性的beforeEach(),所以在我将此标记为正确答案之前,我会等着看是否有人对此有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 2015-07-12
  • 2019-06-10
  • 1970-01-01
  • 2021-02-12
  • 2020-02-14
  • 2020-12-07
相关资源
最近更新 更多