在赛普拉斯使用别名

时间:2018-03-22 14:40:57

标签: cypress

我尝试使用别名在beforebeforeEach个钩子之间共享值。它当前有效,如果我的值是一个字符串但是当值是一个对象时,别名只在第一个测试中定义,之后的每个测试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
});

3 个答案:

答案 0 :(得分:2)

通过expect(user)user语法访问别名变量。我理解这是因为某些命令本质上是异步的,因此使用包装器访问变量可确保在使用之前解析它。

请参阅文档thisVariables 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。最好的方法是:

  • 使用静态用户数据创建一个 fixture file,用于进行测试。 (删除 uuidv4。)
  • 对于需要您的用户数据的测试集,请使用夹具数据在 register 挂钩中调用 before。这将在被测系统中创建数据。
  • 使用 beforeEach 钩子加载夹具数据并为您的每个测试设置别名。现在,无需 API 调用即可访问您需要的静态数据,而且由于 before 挂钩,这些数据可以保证正确存在于系统中。
  • 使用别名运行测试。
  • 清理 after 挂钩中的数据(由于您的用户不再有随机电子邮件,您需要添加此步骤)。

如果您需要对整个测试套件执行上述操作,请将您的 beforeafter 挂钩放在 support file 中以使其全局化。