我尝试使用别名在before
和beforeEach
个钩子之间共享值。它当前有效,如果我的值是一个字符串但是当值是一个对象时,别名只在第一个测试中定义,之后的每个测试this.user
在我的beforeEach钩子中是未定义的。如何在测试之间共享作为对象的值?
这是我的代码:
before(function() {
const email = `test+${uuidv4()}@example.com`;
cy
.register(email)
.its("body.data.user")
.as("user");
});
beforeEach(function() {
console.log("this.user", this.user); // This is undefined in every test except the first
});
答案 0 :(得分:2)
通过expect(user)
或user
语法访问别名变量。我理解这是因为某些命令本质上是异步的,因此使用包装器访问变量可确保在使用之前解析它。
请参阅文档this和Variables and Aliases。
如果您想访问全局let user;
before(function() {
const email = `test+${uuidv4()}@example.com`;
cy
.register(email)
.its("body.data.user")
.then(result => user = result);
});
beforeEach(function() {
console.log("global user", user);
});
值,可以尝试类似
then
console.log
解析就像承诺一样,但您应该对延迟解决感到警惕 - then
可能会在{{1}}之前运行。
答案 1 :(得分:0)
替换
console.log("global user", this.user);
与
cy.log(this.user);
它应该按预期工作。
这样做的原因是 cypress 命令的异步特性。把它想象成一个两步过程:当它们运行时,所有的 cypress 命令都没有按照你的想法去做。他们只是建立了一个命令链。此链将作为稍后的测试执行。
对于像 console.log()
这样的其他命令显然不是这种情况。该命令在准备测试时执行。
这是explained in great detail in the cypress documentation:
但我觉得很难理解这一点。你必须习惯它。 一条经验法则:测试中几乎每个命令都应该是 cypress 命令。
所以只需使用 cy.log
而不是 console.log
如果你必须使用console.log,你可以这样做:
cy.visit("/).then(() => console.log(this.user))
这样 console.log
就被链接起来了。或者,如果您没有要链接的主题,请构建您自己的自定义命令,如下所示:
Cypress.Commands.add("console", (message) => console.log(message))
cy.console(this.user)
在 cypress 中使用 this
的另一个错误是使用箭头函数。如果这样做,您将无权访问您期望的 this
。请参阅 cypress 文档中的 Avoiding the use of this。
答案 2 :(得分:-1)
TL;DR:如果您想在每个测试中使用别名 user
对象,您必须在 beforeEach
钩子中而不是 before
钩子中定义它。
赛普拉斯在测试之间执行大量清理工作,这包括清除所有别名。根据 Variables and Aliases 的共享上下文部分:“每次测试后都会自动清除别名和属性。”您看到的结果(您的别名在第一次测试后被清除,随后未定义)因此是预期的行为。
我无法确定原始帖子中 register
的作用,但您的意图似乎是为了节省在 beforeEach
挂钩中重复执行 API 调用的开销。将您想要的所有内容放在 beforeEach
钩子中并忽略开销绝对是最简单的(此外,没有 UI 交互的纯 API 调用不会产生太大的损失)。
如果您确实需要避免重复,则不应通过常规变量来实现,因为赛普拉斯的自定义链接器可能存在时序问题。这是一个 anti-pattern they publish。最好的方法是:
register
挂钩中调用 before
。这将在被测系统中创建数据。beforeEach
钩子加载夹具数据并为您的每个测试设置别名。现在,无需 API 调用即可访问您需要的静态数据,而且由于 before
挂钩,这些数据可以保证正确存在于系统中。after
挂钩中的数据(由于您的用户不再有随机电子邮件,您需要添加此步骤)。如果您需要对整个测试套件执行上述操作,请将您的 before
和 after
挂钩放在 support file 中以使其全局化。