NGXS:如何测试是否已调度操作?

2023-11-26

如何对某个操作是否已调度进行单元测试?

例如,在 LogoutService 中,我有这个简单的方法:

  logout(username: string) {
    store.dispatch([new ResetStateAction(), new LogoutAction(username)]);
  }

我需要编写一个单元测试来验证这两个操作是否已调度:

  it('should dispatch ResetState and Logout actions', function () {
    logoutService.logout();

    // how to check the dispactched actions and their parameters?
    // expect(...)
  });

如何查看已调度的操作?


NGXS 可管道操作符

NGXS 中的操作是通过 Observables 来处理的。 NGXS 为您提供 Pipeable Operators,对于您的测试,您可以使用ofActionDispatched。这是我从NGXS 文档:

  • ofAction当发生以下任何生命周期事件时触发
  • ofActionDispatched当动作被调度时触发
  • ofActionSuccessful当操作完成时触发 成功地
  • ofActionCanceled当操作被取消时触发
  • ofActionErrored当操作导致错误时触发 抛出
  • ofActionCompleted当操作完成时触发 是否成功(返回完成摘要)

Answer

1. 创建变量actions$

describe('control-center.state', () => {
  let actions$: Observable<any>;

  // ...
});

2. 初始化变量actions$与可观察到的

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [
      NgxsModule.forRoot([AppState]),
      NgxsModule.forFeature([ControlCenterState])
    ]
  });
  store = TestBed.get(Store);
  actions$ = TestBed.get(Actions);
})

3.1 测试是否已调用 1 个操作:

使用运算符从流中过滤您的操作ofActionsDispatched().

it('should dispatch LogoutAction', (done) => {
  actions$.pipe(ofActionDispatched(LogoutAction)).subscribe((_) => {
    done();
  });

  service.logout();
});

3.2 测试是否调用了多个action:

使用 RXJS zip 运算符将两个可观察量与ofActionsDispatched()函数(zip:之后allobservables 发出,以数组形式发出值)。

it('should dispatch ResetStateAction and LogoutAction', (done) => {
  zip(
    actions$.pipe(ofActionDispatched(ResetStateAction)),
    actions$.pipe(ofActionDispatched(LogoutAction))
  ).subscribe((_) => {
    done();
  });

  service.logout();
});

该规范直到其完成后才会完成done叫做。如果done不调用就会抛出超时异常。

来自茉莉花文档.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NGXS:如何测试是否已调度操作? 的相关文章

随机推荐

  • iPad 上的 jQuery 鼠标悬停

    我有一个 jQuery 代码 可以在桌面浏览器上完美运行 span checkbox err mouseout function span checkbox err fadeOut slow 但同样的情况不会在 iPad 上触发 因此 ch
  • 您首选的 php 部署策略是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在开始一个 PHP 的
  • @property(非原子,retain)语句在应用程序中的用途是什么?

    我是一名初学者 iphone 开发人员 我想知道 property nonatomic retain 语句的用途是什么 例如 任何人都可以给我任何答案吗 财产告诉 Objective C 为该成员变量生成 getter 和 setter 合
  • 无限循环滑块概念

    我想知道使用 JavaScript jQuery 为网站构建无限图像循环滑块的最佳概念是什么 良好的可读代码 害虫实践代码 可重用性 我不知道如何编码幻灯片放映 但什么蓝图符合上述要求 我的问题的主要焦点是如何排列图片以获得无限循环滑块的印
  • onActivityResult() 在新的嵌套片段 API 中未调用

    我一直在用新的嵌套片段Android 包含在支持库中的 API 我面对嵌套片段的问题是 如果一个嵌套片段 即 通过FragmentManager由返回getChildFragmentManager calls startActivityFo
  • 如何在 Android 中使用 Java 和 org.json 迭代这个 JSON 数组?

    我的 JSON 字符串看起来像这样 包含在名为的字符串变量中 sJSON id 284 name John surname Doe name Jane surname Doe 我能够像这样解析第一个数组 使用 Java 并导入 org js
  • Magento - 如何检索捆绑的选项图像

    我一直在致力于我的第一个 magento 部署 建立了一个非常定制的主题 现在解决一些非标准定制 我的主要产品类型之一是办公椅 我将其设置为捆绑产品 此产品类型有许多选项 大约 100 种面料选项 手臂样式 腰部 头枕等 我需要能够在目录
  • 为什么我不能在 `const filter_view` 上调用 `ranges::begin` ? [复制]

    这个问题在这里已经有答案了 我无法打电话ranges begin on a const filter view https en cppreference com w cpp ranges filter view the begin and
  • Gradle 将 Spring Boot 应用程序构建为具有活动配置文件的战争

    我想将我的 Spring Boot 应用程序打包为war对于特定的配置文件 这可以通过设置 spring profiles active 来完成个人资料名称在 application properties 文件中 是否可以在构建战争时将其设
  • jQuery Mobile 面板宽度

    在新的 jQuery mobile 中 有一个新的面板选项 我已经实现了这个并且它有效 但我想自定义面板的宽度 标准宽度是272px 对于我的使用来说有点多了 我尝试过使用 ui panel width 150px CSS 选择器 但这只是
  • PHP isset() 在 C/C++ 中的对应部分

    PHP 有一个非常好的函数 isset variableName 它检查 variableName 是否已在程序中定义 我们可以为 C C 构建类似的功能 某种符号表查找 吗 我是一名 C 人员 但我记得在 PHP 中 isset 用于检查
  • objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?

    我正在研究向所有属性添加属性 在本例中为整数 的方法UIView实例 无论它们是否是子类 正在使用objc setAssociatedObject and objc getAssociatedObject 在一个类别中 有什么合适的 苹果认
  • 是什么让 STL 如此快速? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 如果按照通常实现的方式实现
  • 将图像从笛卡尔坐标转换为极坐标

    我正在尝试将具有相同中心的许多圆圈的图像从笛卡尔转换为极坐标 以便新图像将是圆圈 但线条而不是圆圈 请参见下图 并且使用效果很好下面的代码 r c size img r floor r 2 c floor c 2 X Y meshgrid
  • 为什么 System.out.println 这么慢?

    这是所有编程语言的共同点吗 执行多次打印后跟 println 似乎更快 但将所有内容移动到字符串并仅打印似乎最快 为什么 编辑 例如 Java 可以在不到一秒的时间内找到 100 万以内的所有素数 但是在自己的 println 上打印出所有
  • 在 Swift 中的 UIView 中查找 UILabel

    我试图在 UIViewControllers 的超级视图中找到我的 UILabels 这是我的代码 func watch startTime String endTime String if superview nil println Ni
  • Django:如何在javascript中访问当前登录用户的id?

    我在视图集中定义了 get queryset 方法 class BooksViewSet ReadOnlyModelViewSet serializer class BooksSerializer permission classes Is
  • Selenium 无法与经过修改以避免检测的 chromedriver 一起使用

    我问这个是因为我知道这个线程 and 这个线程 以及其他关于同一主题的问题 但每个人在第一个线程中转发的解决方案不再有效 因此 请不要将其标记为已关闭 因为第一个线程已存在 答案是 2016 年的 你可以看到最近的评论遇到了麻烦 我正在使用
  • NameNotFoundException:仅在从 Eclipse Kepler 而非 Indigo 发布时尝试查找“jdbc”

    我能够将我的 Web 应用程序从 Eclipse Indigo 3 7 2 与 oepe 12 1 1 1 1 发布到 Oracle Weblogic 12c 12 1 1 AdminServer 然而 使用 oepe 12 1 2 2 导
  • NGXS:如何测试是否已调度操作?

    如何对某个操作是否已调度进行单元测试 例如 在 LogoutService 中 我有这个简单的方法 logout username string store dispatch new ResetStateAction new LogoutA