Angular 2单元测试:如何在测试台中覆盖单个提供商(用于服务的单位测试,而不是与服务依赖关系的组件)



我有:

beforeEach(() => {
   TestBed.configureTestingModule({
        providers: [
            DocumentsLoaderSvc,
           { provide: MgrSvc, useClass: MockMgrSvc },
           { provide: URLLoaderSvc, useClass:  MockURLLoaderSvcWhenData}
        ]
    });
});

我如何用另一个模拟来覆盖urlloadersvc,以"有自己独特的要求?是否有类似testbed.overrideprovider的东西...现在,我用它自己的每个IT语句都用自己的each。

也许您最好的选择就是使模拟可配置以适应不同测试用例的需求。将其作为实例并使用useValue代替useClass

let urlLoderSvc: URLLoaderSvc;
beforeEach(() => {
  urlLoaderSvc = new URLLoaderSvc();
  TestBed.configureTestingModule({
     providers: [
        DocumentsLoaderSvc,
        { provide: MgrSvc, useClass: MockMgrSvc },
        { provide: URLLoaderSvc, useValue: urlLoaderSvc }
     ]
  });
});

现在在it测试用例中,您只需配置urlLoaderSvc实例即可完成您想要的任何事情。

您可以在需要的每个beforeEach中使用ts-mockeryMock.extend。这里的问题在于,此时的服务已经在组件中注入 - 重新提供它将不会更新已经注入的实例。在这种情况下,您将需要为更改提供的实例的每个测试创建固定装置。拥有一个灵活的模拟实例更容易,您可以在每个测试之前进行配置。

,但是有时需要它,例如,例如,如果您有需要HTTP服务调用的存储库服务,则需要对此调用进行测试,以确保Repo Service正确反应。

我这样做的方式是:

let urlLoderSvc: URLLoaderSvc;
beforeEach(() => {
  TestBed.configureTestingModule({
     providers: [
        DocumentsLoaderSvc,
        { provide: MgrSvc, useClass: MockMgrSvc },
        { provide: URLLoaderSvc, useValue: urlLoaderSvc }
     ]
  });
  urlLoaderSvc = TestBed.inject(DocumentsLoaderSvc);
  // same for other mock services, e.g.:
  const mockedMgrSvc = TestBed.inject(MgrSvc) as unknown as MockMgrSvc;
});

最新更新