如何在Cypress测试中更新全局变量



我想在Cypress测试文件中使用一个Global变量,但尽管添加了等待,它的值并没有像预期的那样改变。

const builder = {
stepsArr: []
};
describe('my test', () => {
beforeEach(() => {
cy.intercept('/graphql', (req) => {
req.continue((res) => {
if (res.body.data?.steps) {
builder.stepsArr = res.body.data.steps.steps;
console.log({ stepsArr: builder.stepsArr }); // logs correctly!
}
});
}).as('graphqlRequest');
});
it.only('should check global var', () => {
cy.waitFor('steps');
cy.wrap({ getStepByTitle: pathwayBuilder.getStepByTitle })
.invoke('getStepByTitle',
'some title',
builder.stepsArr // always empty array!
)
.then((stepObj) => {
cy.log(stepObj);
});
});
});

执行顺序正确,但全局变量的值没有更新。尽管重试了大约100次,但当我调用函数时,它显示空数组。可能出了什么问题?

cy.waitFor('steps');来自support/commands.js文件中的命令

Cypress.Commands.add('waitFor', operationName => {
cy.wait('@graphqlRequest').then(({ request }) => {
if (request.body.operationName !== operationName) {
cy.log('Waiting for:', operationName)
return cy.waitFor(operationName)
}
return null
})
})

该功能只记录控制台上的参数

exports.pathwayBuilder = {
getStepByTitle: (title, steps) => {
console.log("Search", title);
console.log("Steps", steps); // empty!
}
}

我认为.invoke()参数是错误的,请参阅此示例invoke((-带参数的函数

const fn = (a, b, c) => {
return a + b + c
}
cy.wrap({ sum: fn })
.invoke('sum', 2, 4, 6)
.should('be.gt', 10) // true
.and('be.lt', 20) // true

该函数接受三个参数,它们以逗号分隔的形式传递。

getStepByTitle接受两个参数,但传入一个——一个包含第二个参数的对象

所以

.invoke('getStepByTitle', {
steps: builder.stepsArr // always empty array!
})

应该是

.invoke('getStepByTitle', 'aTitle', builder.stepsArr )

我在运行测试时发现了更多的东西

  1. getStepByTitle()需要返回一些东西,否则stepObj(.invoke()的结果(将是未定义的

  2. cy.wait()在自定义命令中不会成功(对我来说(,但如果我在测试中内联自定义命令的代码(对于参考Cypress 7.1.0(,它确实有效

  3. 则CCD_ 9在CCD_。看起来像是某种优化,当命令添加到队列时,Cypress正在调用。

替代

.then(obj => obj.getStepByTitle('some title', builder.stepsArr))` 

对于

.invoke('getStepByTitle', 'some title',  builder.stepsArr )

最新更新