1

我最近有一个要为其编写单元测试的企业项目。该应用程序真的很大。它有一个大的注射三。当我设置测试时,我花了半天时间只模拟注入的服务。问题是,我正在测试的服务有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},
            ...
        ]
    });
  });
});

我想知道是否有一种更简单(耗时更少)的方式来做到这一点?

4

1 回答 1

0

以下是您可以遵循的最佳实践:

  1. 在名为mocksTests的文件夹下有一个模拟测试类列表。不要在每个规范文件中创建一个类。
  2. 您可以直接将它们添加到 providers 数组中,并在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},
            ...
        ]
    });
  });
});
于 2019-08-21T14:11:43.653 回答