使用大量注入服务测试角度应用

时间:2019-07-01 05:34:02

标签: angular unit-testing jasmine angular-unit-test

我最近有一个企业项目要为其编写单元测试。该应用程序确实非常庞大。它有一个大的注射三口。在设置测试时,我花了半天的时间仅模拟注入的服务。问题是,我正在测试的服务具有n个注入服务的数量,其中每个注入的服务又具有n个注入服务的数量,并且列表继续增加到无限数量。目前,我只是通过创建伪造的类来嘲笑它们,但是再次,为每个伪造的类编写伪造的方法在该项目中是一项非常耗时的工作。 (主要是因为每个注入的服务在构造函数中都有大量的订阅)。

我当前的测试设置:

class FrameStateServiceStub {
    public changedCurrentFrame: Observable<LayerId> = EMPTY;
    public changedAvailableFrames: Observable<LayerId> = of("");

    public getCurrentFrame(layerId: LayerId): Frame {
        return frame;
    }

    public getAvailableFrames(layerId: LayerId): Frame[] {
        return [frame];
    }
}

class LoadingIndicatorServiceStub {
}

describe("DisplayService", () => {

  const frameStateServiceStub = new FrameStateServiceStub();
  const loadingIndicatorServiceStub = new LoadingIndicatorServiceStub();

  beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            DisplayService,
            {provide: FrameStateService, useValue: frameStateServiceStub},
            {provide: LoadingIndicatorService, useValue: loadingIndicatorServiceStub},
            ...
        ]
    });
  });
});

我想知道是否有更简单(更省时)的方法?

1 个答案:

答案 0 :(得分:0)

以下是您可以遵循的最佳做法:

  1. 在名为 mocksTests 的文件夹下具有模拟测试类的列表。不要在每个规格文件中都创建一个类。
  2. 您可以直接添加它们,而不是在每个spec文件中实例化类。 在提供程序数组中,并在 useClass 中而不是在 useValue 中引用它们。
  3. 您不必担心n个已注入服务的数量, 注入服务又有n个注入服务”。你可以 专注于添加组件/服务的构造函数中使用的服务。
import { MockFrameStateService } from '../some/path1';
import { MockLoadingIndicatorService } from '../some/path2';

...

describe("DisplayService", () => {
   beforeEach(() => {
      TestBed.configureTestingModule({
        providers: [
            DisplayService,
            {provide: FrameStateService, useClass: MockFrameStateService },
            {provide: LoadingIndicatorService, useClass: MockLoadingIndicatorService},
            ...
        ]
    });
  });
});