You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Cypress测试独立组件时出现MockStore无提供者错误

问题:Cypress测试Angular独立组件时无法注入MockStore

我正尝试使用Cypress测试依赖NgRx Store数据的AppComponent,已按照官方文档配置测试环境,测试代码如下:

let store: MockStore;
let initialState: { loggedOnUser: null };

beforeEach(() => {
    cy.mount(AppComponent, setupCypressConfig<AppComponent>({
        providers: [
            provideMockStore({ initialState }),
        ]
    }));
    store = TestBed.inject(MockStore);
});

运行测试时出现错误:

NullInjectorError: No provider for MockStore!

该配置在另一个组件中可正常运行,且我使用的是Angular独立组件。我尝试了以下方案但均无效:

  • 注入Store而非MockStore,即store = TestBed.inject(Store);
  • 在providers中添加MockStore,配置如下:
cy.mount(AppComponent, setupCypressConfig<AppComponent>({
   providers: [
      MockStore,
      provideMockStore({ initialState }),
   ]
}));

解决方法

问题核心是Cypress的组件挂载上下文和TestBed不共享,直接用TestBed.inject无法获取到Cypress挂载模块中提供的MockStore实例。以下是可行的修复方案:

方案1:使用Cypress的cy.getAngularService获取MockStore

替换TestBed.inject为Cypress提供的Angular服务获取方法,确保从正确的上下文获取实例:

import { MockStore } from '@ngrx/store/testing';

let store: MockStore;
// 确保initialState类型与应用实际State匹配,避免类型不兼容问题
const initialState = { loggedOnUser: null };

beforeEach(() => {
  cy.mount(AppComponent, setupCypressConfig<AppComponent>({
    providers: [
      provideMockStore({ initialState }),
    ]
  }));
  
  // 通过Cypress获取MockStore实例
  cy.getAngularService(MockStore).then(mockStore => {
    store = mockStore;
  });
});

方案2:检查独立组件的依赖配置

确保AppComponent没有在自身的providers中声明Store(会覆盖测试环境的MockStore),同时如果组件依赖NgRx的相关模块,需要在挂载配置的imports中显式引入:

import { StoreModule } from '@ngrx/store';

beforeEach(() => {
  cy.mount(AppComponent, {
    imports: [StoreModule.forRoot({})], // 显式导入Store基础模块
    providers: [
      provideMockStore({ initialState: { loggedOnUser: null } }),
    ]
  });

  cy.getAngularService(MockStore).then(mockStore => {
    store = mockStore;
  });
});

方案3:手动创建并提供MockStore实例

如果上述方法仍无效,可以手动实例化MockStore并添加到providers中:

import { MockStore, provideMockStore } from '@ngrx/store/testing';
import { State } from './path-to-your-app-state';

beforeEach(() => {
  const initialState: State = { loggedOnUser: null };
  
  cy.mount(AppComponent, setupCypressConfig<AppComponent>({
    providers: [
      provideMockStore({ initialState }),
      // 手动提供MockStore的提供者,确保DI能找到
      { provide: MockStore, useFactory: (store: Store) => store as MockStore, deps: [Store] }
    ]
  }));

  cy.getAngularService(MockStore).then(mockStore => {
    store = mockStore;
  });
});

内容的提问来源于stack exchange,提问作者Pablo52

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:21