赛普拉斯:选择随机枚举值

时间:2021-02-17 13:35:32

标签: typescript random enums cypress

我的 Cypress 测试中有很多枚举,我想将其中的一些随机化。例如,当我使用 Kotlin 时,这很容易。但是,我无法使用 Cypress/TypeScript,而且我对该语言的了解非常有限。

枚举可以具有以下值: 目的.构建,目的.购买,目的.重建

这是我到目前为止所获得的,从我现在不记得的地方挑选的(也许是 StackOverflow?):

randomEnum<T>(anEnum: T): T[keyof T] {
  const enumValues = Object.keys(anEnum)
    .map(n => Number.parseInt(n))
    .filter(n => !Number.isNaN(n)) as unknown as T[keyof T][]
  const randomIndex = Math.floor(Math.random() * enumValues.length)
  return enumValues[randomIndex];
}

调用方式:

const Purpose = ProsjektfinansieringTO.FinansieringsProdukterEnum;

// Get a random value for Purpose:
let purpose: FinansieringsProdukterEnum = this.randomEnum(Porpose);
// Select the apporpriate choice on the page:
purposePage.setPurpose(purpose);         // Doesn't work
//purposePage.setPurpose(Purpose.BUY);   // Works.
   

据我所知,randomEnum() 函数不返回枚举。由于下面被注释掉的行有效,我相信错误与 randomEnum() 函数有关。

有什么提示吗?我错过了什么?真的有这么复杂吗?

采取 2:

对代码有了更多的了解,我尝试按照预期的方式使用它。我从 randomEnum() 方法中获得一个随机的枚举值 numer,然后我尝试根据它选择页面元素。但是,我仍然无法让它工作。它适用于指定枚举值而不是获取随机值。

setRandomPurpose() {
  let purpose: FinansieringsProdukterEnum = this.randomEnum(Purpose);
  
  purposePage.setPurpose(Purpose[purpose]); // Doesn't work.
  //purposePage.setPurpose(Purpose.BUY);    // THIS works.
}

randomEnum<T>(anEnum: T): T[keyof T] {
  const enumValues = Object.keys(anEnum)
    .map(n => Number.parseInt(n))
    .filter(n => !Number.isNaN(n)) as unknown as T[keyof T][]
  const randomIndex = Math.floor(Math.random() * enumValues.length)
  return enumValues[randomIndex];
}

目的页面类:

import FinansieringsProdukterEnum = ProsjektfinansieringTO.FinansieringsProdukterEnum;

public setPurpose(Purpose: FinansieringsProdukterEnum) {
cy.pause();

switch (formal) {
  case "BUY": this.buyRadioLabel.click();
    break;
  case "REBUILD": this.rebuildRadioLabel.click();
    break;
  case "BUILD": this.buildRadioLabel.click();
    break;
  }
  cy.pause();
}      

采取 3

“工作”类:

import FinansieringsProdukterEnum =    ProsjektfinansieringTO.FinansieringsProdukterEnum;
const Purpose = ProsjektfinansieringTO.FinansieringsProdukterEnum;

export class PurposeWorkflow {
  setRandomPurpose() {
    let purpose: FinansieringsProdukterEnum = this.randomEnum(Purpose);
    purposePage.setPurpose(purpose);
  }
}

import FinansieringsProdukterEnum = ProsjektfinansieringTO.FinansieringsProdukterEnum;

public setPurpose((purpose: FinansieringsProdukterEnum) {
  switch (FinansieringsProdukterEnum[(purpose]) {
    case "BUY": this.buyRadioLabel.click();
      console.log('buyRadioLabel');
      cy.pause();
      break;
    case "REBUILD": this.rebuildRadioLabel.click();
      console.log('rebuildgRadioLabel');
      cy.pause();
      break;
    case "BUILD": this.buildRadioLabel.click();
      console.log('oppforingRadioLabel');
      cy.pause();
      break;
  }
}

这不起作用。请注意,我使用 cy.pause() 只是为了检查条件是否经过数学处理,而它们从来没有。我在使用 console.log() 时遇到问题,因为我必须在 Cypress 中使用 Electron 浏览器。这是非常错误的。但是,使用 cy.pause() 行应该指出我在代码中的位置。

我也在“工人阶级”中尝试过这个:

setRandomFormal() {
    let formal: FinansieringsProdukterEnum = this.randomEnum(Formal);
    console.log(formal);          //Both of these shows "undefined.
    //console.log(Forma[formal]);
}

第 4 个

我开始怀疑问题是否与我使用的 Enum 类型有关...

export interface ProsjektfinansieringTO { 
   // Removed lots of variables for simplicity's sake.
}
export namespace ProsjektfinansieringTO {
  export type FinansieringsProdukterEnum = 'BUILD' | 'BUY' | 'REBUILD';
  export const FinansieringsProdukterEnum = {
    BUILD: _('BUILD') as FinansieringsProdukterEnum,
    BUY: _('BUY') as FinansieringsProdukterEnum,
    REBUILD: _('REBUILD') as FinansieringsProdukterEnum,
  };
}

故障排除:

在同一个“工作”代码中,我在本地添加了以下两个枚举,以尝试隔离“未定义”错误的原因:

enum PrintMedia {
  Newspaper,
  Newsletter,
  Magazine,
  Book
}

export type FinansieringsProdukterEnum2 = 'BUILD' | 'BUY' | 'REBUILD';
const FinansieringsProdukterEnum2 = {
  BUILD: ('BUILD') as FinansieringsProdukterEnum2,
  BUY: ('BUY') as FinansieringsProdukterEnum2,
  REBUILD: ('REBUILD') as FinansieringsProdukterEnum2
};

// Works:    
let printmedia: PrintMedia = this.randomEnum(PrintMedia);
console.log('Printmedia: ' + PrintMedia[printmedia]);

// Doesn't work: ('undefined')
let purpose2 = this.randomEnum(FinansieringsProdukterEnum2);
console.log('FinansieringsProdukterEnum2: ' + FinansieringsProdukterEnum2[purpose2]); 

0 个答案:

没有答案