【问题标题】:No provider for MockStateMockState 没有提供者
【发布时间】:2020-01-14 16:22:39
【问题描述】:

我仍在研究 Angular 单元测试方面的问题。我相信这是我第一次从头开始为服务编写单元测试。我复制/粘贴了另一个代码并尝试对其进行调整。到目前为止,这是我所拥有的:

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)

我用谷歌搜索了这个,我发现最接近的是:Angular - Karma - ngrx - No provider for Store,但不认为它适用。

真的不知道接下来要尝试什么。

【问题讨论】:

  • 在我看来,您的Store(在这种情况下为MockStore)依赖于一个名为MockState 的服务,但在您的测试模块配置中,您没有提供MockState。跨度>
  • 我认为@AliF50 是对的。您应该为您的全局配置添加此状态或在本地单元测试文件中创建假存储模块并将您的状态放在那里。
  • 就是这样!谢谢。

标签: angular typescript jasmine karma-jasmine


【解决方案1】:

正如@AliF50 所指出的,问题在于 MockStore 使用了 MockState。添加它会产生一系列必须添加的东西,并且还会产生 InjectionToken 问题。

我终于摆脱了懦夫的出路,实现了自己的TestMock注入,一切正常。

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 2021-05-06
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多