即使在beforeEach挂钩中更改了值之后,原始值仍用于动态测试

时间:2019-02-08 09:21:01

标签: javascript typescript cypress

我的设置: 我正在cypress上进行一些动态测试,即获得了环境变量中一些名称的列表。测试数量取决于此列表中名称的数量。

我的目标: 我想做的是以这种方式操作包含列表的数组,如果它包含通过环境变量传递的单词“ ALL”,那么我想更改数组并添加使用API​​获得的所有名称呼叫。这使我可以选择获取所有名称,而不是手动一个个地写它们。

我的问题: 尽管beforeEach()在测试之前运行,但数组中包含的值仍然与通过环境变量获取的值相同。我假设 describe()中但在 it() beforeeach()外的代码首先运行...但是即使在之后beforeEach()运行并更新我的数组,当测试开始时,它们仍然使用来自环境变量的旧值。

我想根据环境变量“ ALL”或某些名称中传递的条件来有条件地更新数组。

我的代码:

describe('[' + Cypress.env('TEAM') + ' - ' + Cypress.env('CLUSTER') + '] - ', () => {

    let dataPoolsArray: string[] = Cypress.env('DATAPOOLS').split(',') // this is being read directly from env variable

    beforeEach(() => {
        cy.defaultLogin()

        if ( Cypress.env('DATAPOOLS') === 'ALL') { // Depending on my env variable I want to change the value of the array here
            dataPoolsArray.length = 0
            let i = 0
            cy.Integration_DataPool_findAll().then((getDataPoolsResponse) => {
                getDataPoolsResponse.body
                .forEach((dataPool: any) => {
                    dataPoolsArray.push(dataPool.name) 
                    cy.log('dataPoolsArray:  ' + dataPoolsArray[i])
                    i ++
                })
            })

        }

    })



    dataPoolsArray.forEach((poolName) => { // However when I run my test it just takes "ALL" as the only value in the array

        it('Data Model for pool: ' + poolName, () => {
            cy.log('Checking if datamodel loaded for the pool: ' + poolName)
            cy.sendPqlQueryToAnalysisConnectedToPool(poolName)
        })

    })


})

我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题::您试图通过同步循环遍历在it钩中异步填充的数组来动态生成beforeEach测试用例-即使代码在该钩子内是同步的(不是),该钩子本身在您生成以下it测试之后的之后运行。

解决方案: AFAIK,除了同步并在任何钩子之外填充dataPoolsArray数组,别无其他方法-因为Mocha(和Cypress)需要套件({{1 }}和测试用例(describe)进行同步注册。

话虽如此,您可以在运行cypress之前或通过预处理测试文件本身somehow来生成整个测试文件。