没有 MockState 的提供者
No provider for MockState
我仍在研究 Angular 单元测试方面的问题。我相信这是我第一次从头开始为服务编写单元测试。我有来自另一个的 copy/pasted 代码并尝试对其进行改编。这是我目前所拥有的:
describe('SERVICE -> EditServiceProcedureAuthorizationService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientModule],
providers: [
EditServiceProcedureAuthorizationService,
{ provide: Store, useClass: MockStore },
{ provide: AuthorizationsService, useClass: MockAuthorizationsService },
{ provide: ServiceProcedureAuthorizationWorkflowService, useClass: ServiceProcedureAuthorizationWorkflowServiceMock },
{ provide: SpViewAuthorizationDetailsService, useClass: MockSpViewAuthorizationDetailsService }
]
});
});
it('should loadAuthorization()', inject(
[EditServiceProcedureAuthorizationService, Store, AuthorizationsService, ServiceProcedureAuthorizationWorkflowService,
SpViewAuthorizationDetailsService],
fakeAsync(
(
editServiceProcedureAuthorizationService: EditServiceProcedureAuthorizationService,
mockStore: MockStore<AppStore>,
mockAuthorizationService: MockAuthorizationsService,
mockServiceProcedureAuthWorkflowService: ServiceProcedureAuthorizationWorkflowServiceMock,
mockSpViewAuthorizationDetailsService: MockSpViewAuthorizationDetailsService
) => {
const dispatchSpy: Spy = spyOn(mockStore, 'dispatch');
editServiceProcedureAuthorizationService.loadAuthorization(undefined, undefined);
expect(dispatchSpy).not.toHaveBeenCalled();
const memberId = '42';
const authId = 'auth42';
editServiceProcedureAuthorizationService.loadAuthorization(memberId, authId);
expect(dispatchSpy).toHaveBeenCalledTimes(1);
}
)
));
});
然后,当我尝试 运行 这个时,我得到:
Error: StaticInjectorError(DynamicTestModule)[Store -> MockState]:
StaticInjectorError(Platform: core)[Store -> MockState]:
NullInjectorError: No provider for MockState!
at NullInjector.get node_modules/@angular/core/fesm5/core.js:8894:1)
at resolveToken node_modules/@angular/core/fesm5/core.js:9139:1)
at tryResolveToken node_modules/@angular/core/fesm5/core.js:9083:1)
at StaticInjector.get node_modules/@angular/core/fesm5/core.js:8980:1)
at resolveToken node_modules/@angular/core/fesm5/core.js:9139:1)
at tryResolveToken node_modules/@angular/core/fesm5/core.js:9083:1)
at StaticInjector.get node_modules/@angular/core/fesm5/core.js:8980:1)
at resolveNgModuleDep node_modules/@angular/core/fesm5/core.js:21120:1)
at _createClass node_modules/@angular/core/fesm5/core.js:21173:1)
at _createProviderInstance node_modules/@angular/core/fesm5/core.js:21137:1)
我用谷歌搜索了这个,我找到的最接近的是:,但我认为它不适用。
真的不确定接下来要尝试什么。
正如@AliF50 所指出的,问题在于 MockStore 使用了 MockState。添加这个会产生一系列必须添加的东西,并且还会产生 InjectionToken 问题。
我终于走了胆小鬼的路,实现了我自己的 TestMock 注入,一切正常。
我仍在研究 Angular 单元测试方面的问题。我相信这是我第一次从头开始为服务编写单元测试。我有来自另一个的 copy/pasted 代码并尝试对其进行改编。这是我目前所拥有的:
describe('SERVICE -> EditServiceProcedureAuthorizationService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientModule],
providers: [
EditServiceProcedureAuthorizationService,
{ provide: Store, useClass: MockStore },
{ provide: AuthorizationsService, useClass: MockAuthorizationsService },
{ provide: ServiceProcedureAuthorizationWorkflowService, useClass: ServiceProcedureAuthorizationWorkflowServiceMock },
{ provide: SpViewAuthorizationDetailsService, useClass: MockSpViewAuthorizationDetailsService }
]
});
});
it('should loadAuthorization()', inject(
[EditServiceProcedureAuthorizationService, Store, AuthorizationsService, ServiceProcedureAuthorizationWorkflowService,
SpViewAuthorizationDetailsService],
fakeAsync(
(
editServiceProcedureAuthorizationService: EditServiceProcedureAuthorizationService,
mockStore: MockStore<AppStore>,
mockAuthorizationService: MockAuthorizationsService,
mockServiceProcedureAuthWorkflowService: ServiceProcedureAuthorizationWorkflowServiceMock,
mockSpViewAuthorizationDetailsService: MockSpViewAuthorizationDetailsService
) => {
const dispatchSpy: Spy = spyOn(mockStore, 'dispatch');
editServiceProcedureAuthorizationService.loadAuthorization(undefined, undefined);
expect(dispatchSpy).not.toHaveBeenCalled();
const memberId = '42';
const authId = 'auth42';
editServiceProcedureAuthorizationService.loadAuthorization(memberId, authId);
expect(dispatchSpy).toHaveBeenCalledTimes(1);
}
)
));
});
然后,当我尝试 运行 这个时,我得到:
Error: StaticInjectorError(DynamicTestModule)[Store -> MockState]:
StaticInjectorError(Platform: core)[Store -> MockState]:
NullInjectorError: No provider for MockState!
at NullInjector.get node_modules/@angular/core/fesm5/core.js:8894:1)
at resolveToken node_modules/@angular/core/fesm5/core.js:9139:1)
at tryResolveToken node_modules/@angular/core/fesm5/core.js:9083:1)
at StaticInjector.get node_modules/@angular/core/fesm5/core.js:8980:1)
at resolveToken node_modules/@angular/core/fesm5/core.js:9139:1)
at tryResolveToken node_modules/@angular/core/fesm5/core.js:9083:1)
at StaticInjector.get node_modules/@angular/core/fesm5/core.js:8980:1)
at resolveNgModuleDep node_modules/@angular/core/fesm5/core.js:21120:1)
at _createClass node_modules/@angular/core/fesm5/core.js:21173:1)
at _createProviderInstance node_modules/@angular/core/fesm5/core.js:21137:1)
我用谷歌搜索了这个,我找到的最接近的是:
真的不确定接下来要尝试什么。
正如@AliF50 所指出的,问题在于 MockStore 使用了 MockState。添加这个会产生一系列必须添加的东西,并且还会产生 InjectionToken 问题。
我终于走了胆小鬼的路,实现了我自己的 TestMock 注入,一切正常。