如何将redux操作登录到Cypress控制台

esyap4oy  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(128)

我在让cypress正确记录我们的应用程序正在处理的每个redux操作时遇到了麻烦,作为cypress控制台的实时提要。
我假设这将需要订阅我们的actions对象,该对象使用以下代码通过window对象暴露给cypress。

import { Component, OnInit } from '@angular/core';
import { Actions } from '@ngrx/effects';

@Component({
  selector: 'application-initialize-cypress-variables-component',
  templateUrl: './initialize-cypress-variables.component.html',
})
export class InitializeCypressVariablesComponent implements OnInit {
  public constructor(private readonly actions: Actions) { }

  public ngOnInit(): void {
    if (window.top.Cypress) {
      window.actions = this.actions;
    }
  }
}

然后在cypress中订阅这个对象就非常简单了,我们只需要在每次我们的应用程序dispacted一个action时使用cy.log,这可以通过在window.action的subscribe块中添加cy.log来完成。

actions.subscribe((action) => {
      cy.log(action.type);
    });

这可以正常工作,并将每个正在处理的redux操作作为实时提要注销到cypress控制台。问题是我得到了这个控制台错误,它说了一些沿着的话:“Cypress detected that you returned a promise from a command while also invoked one or more cy commands in that promise”as the actions are being logged out.这让我觉得我做错了什么。Any idea?

4zcjmb1e

4zcjmb1e1#

这可能根本不可能,因为Cypress命令在它们自己的队列中异步运行。
这意味着当你的javascript发出一个cy.log(some-param)调用时,它说的是“在所有前面的命令运行之后为some-param添加一个日志条目”,但它实际上并没有在那个时间点执行日志。
你可以用Cypress.log()来做,因为它会立即运行。

actions.subscribe((action) => {
  Cypress.log({
    displayName: 'action',
    message: action.type
  })
})

但请注意,Cypress命令队列和redux操作队列都与测试运行器的Javascript异步。
我想你需要一些东西来同步这两者,一些在测试中执行一个步骤,然后等待结果redux动作完成的东西。

相关问题