[英]Cypress: Custom command returns array: How loop to run test suite?
问题:
尝试在从赛普拉斯自定义命令返回的项目数组中调用测试。
尝试使用npm package mocha-each和使用forEach
function 的另一个测试的方法。
自定义命令:
我创建了一个自定义 Cypress 命令,该命令返回AppParamsType
数组:
/// <reference types="Cypress" />
import { AppParamsType } from 'support';
declare global {
namespace Cypress {
interface Chainable {
cmdGetAppsParams: () => Chainable<AppParamsType[]>;
}
}
}
export function cmdGetAppsParams() {
const paramsApps: AppParamsType[] = [];
cy.cmdAppKeys()
.then(($appKeys: string[]) => {
cy.wrap($appKeys).each(($appKey: string) => {
cy.cmdProviderAppParams($appKey).then((paramApp: AppParamsType) => {
paramsApps.push(paramApp);
});
});
})
.then(() => {
return cy.wrap(paramsApps);
});
}
Cypress.Commands.add('cmdGetAppsParams', cmdGetAppsParams);
使用自定义命令进行测试:
以下赛普拉斯测试调用自定义命令cmdGetAppsParams()
以返回项目数组。
正在迭代该阵列,其中一项测试使用npm package mocha-each和另一项测试使用Array forEach 。 两种方法都没有调用循环内的测试。
import * as forEach from 'mocha-each';
let apps: AppParamsType[];
describe('DESCRIBE Apps Add Apps Spec', () => {
before('BEFORE', () => {
cy.cmdGetAppsParams().then(($apps: AppParamsType[]) => {
expect($apps).to.be.an('array').not.empty;
apps = $apps;
});
});
it('TEST Apps Params Array', () => {
cy.task('log', { line: 'A', data: apps });
expect(apps).to.be.an('array').not.empty;
});
it('TEST each item mocha forEach', () => {
cy.task('log', { line: 'B', data: apps });
forEach(apps).it('item', (item: AppParamsType) => {
cy.task('log', { line: 'B.1', data: item });
expect(item).to.be.an('object').not.null;
});
});
it('TEST each item array forEach', () => {
cy.task('log', { line:'C', data: apps });
expect(apps).to.be.an('array').not.empty;
apps.forEach((item: AppParamsType) => {
it('TEST App Param', () => {
cy.task('log', { line: 'C.1', data: item });
expect(item).to.be.an('object').not.null;
});
});
});
我看到的结果是,由标签'A' 、 'B'和'C'指示的外部测试正在被调用。 但是,不是内部测试,这将由标签'B.1'和'C.1'表示:
{
"line": "A",
"data": [
***
]
}
{
"line": "B",
"data": [
***
]
}
{
"line": "C",
"data": [
***
]
}
在it()
中嵌套it()
看起来很新颖。 我很惊讶你没有从中得到错误。
动态生成测试的基本问题是 Cypress 运行程序需要在开始运行测试之前准确知道将生成多少测试。 但是任何 Cypress 命令(包括自定义命令)在整个测试脚本完成运行(不包括回调代码)之前都不会运行,因此您无法从自定义命令中获取apps
列表。
The best way to proceed is to convert cy.cmdAppKeys()
, cy.cmdGetAppsParams()
, and cy.cmdProviderAppParams()
from custom commands to a plain javascript function, and then run that function at the top of the script, eg
const apps = getMyApps(); // synchronous JS function,
// will run as soon as the test starts
apps.forEach((item: AppParamsType) => {
const titleForTest = `Test App Param ${item.name}`; // Construct an informative title
it(titleForTest, () => {
...
})
})
如果您可以提供自定义命令cy.cmdAppKeys()
和cy.cmdProviderAppParams()
的详细信息,或许可以帮助转换为同步 function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.