我有:
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-mockery
和Mock.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;
});