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

NgRx Signal Store:如何模拟withEntities实体?

如何在组件测试中模拟带有withEntities特性的NgRx Signal Store

当你的NgRx Signal Store使用withEntities特性时,它会自动生成一系列实体管理相关的信号(如entities、ids、entityMap)和操作方法(如addEntities、updateEntities)。测试时只需模拟组件实际用到的部分即可,无需实现全部接口。

1. 创建模拟Store对象

根据组件依赖的属性,用Angular的signal包装预设数据,同时模拟需要的操作方法(可用测试框架的spy函数做调用断言):

import { signal } from '@angular/core';
// 若用Jasmine
import jasmine from 'jasmine';
// 若用Jest则替换为jest.fn()

type Todo = {
  id: number;
  text: string;
  completed: boolean;
};

const mockTodosStore = {
  // 模拟entities信号,返回预设的待办数据
  entities: signal<Todo[]>([
    { id: 1, text: '完成测试用例', completed: false },
    { id: 2, text: '整理文档', completed: true }
  ]),
  // 模拟addEntities方法,用于后续断言调用情况
  addEntities: jasmine.createSpy('addEntities'),
  // 若组件用到ids/entityMap,按需模拟
  ids: signal<number[]>([1, 2]),
  entityMap: signal<Record<number, Todo>>({
    1: { id: 1, text: '完成测试用例', completed: false },
    2: { id: 2, text: '整理文档', completed: true }
  })
};

2. 在测试模块中注入模拟对象

将上述模拟对象作为TodosStore的提供者:

TestBed.configureTestingModule({
  imports: [SomeComponent],
  providers: [
    {
      provide: TodosStore,
      useValue: mockTodosStore
    },
  ],
});

3. 测试中更新模拟状态(可选)

如果需要在测试流程中修改实体数据,直接调用信号的set方法更新即可:

// 添加新的待办项
mockTodosStore.entities.set([
  ...mockTodosStore.entities(),
  { id: 3, text: '优化代码', completed: false }
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:49:57