如何在 Cypress 中使用与 Axios 相同的节点环境

How to use the same Node Environment as Axios with Cypress

我有一个网站,您可以在其中提交一个在服务器上启动作业的表单。要开始这项工作,您发送一个请求,并在响应中返回工作 ID。然后,我的网站会请求获取此作业的状态,直到它完成。

对于 cypress,我想等到作业完成后再进行下一步。为此,我需要知道工作何时完成。我使用 axios 发出请求,我想向 axios 发出的所有请求添加一个 interceptor ,这样我就可以查找创建作业的请求以获取其 id,然后查找获取它的请求状态,这样我就可以知道它什么时候完成了。

我已经尝试这样做,但是当我从我的请求文件中导入 axios 实例时,我注意到我的请求文件中的任何 console.logs 都被打印了两次。这意味着当 cypress 导入变量时,它又是 运行 文件,这意味着 cypress 无法访问实际发出请求的 axios 实例,而是一个仅由 cypress 使用的新实例。

当我打印 process.env.NODE_ENV 时,它用两个不同的值打印了两次

我知道我可以使用 Cypress.env('NODE_ENV') 打印 env 变量,但显然 cypress 没有使用与我的 API 文件相同的变量 scope/enviornment。我也试过将 cypress.json 设置为

{
    "env" : {
        "NODE_ENV" : "development"
    }
}

和 运行 这在我的测试文件的顶部 process.env.NODE_ENV = Cypress.env('NODE_ENV') 但这没有用。我还在我调用 cypress 的终端中尝试了 export NODE_ENV = development 但这没有用。这也是我用来调用 cypress "cypress": "./node_modules/.bin/cypress open" 的 package.json 脚本,我使用的是 cypress 3.1.0 和 node 9.5.0

是否有可能让 cypress 与变量交互?我的柏树或节点设置有误吗?

Cypress 确实提供了对 javascript 的本地访问,但只能通过 cy.window(),因此尝试 "merge" 这两个范围是徒劳的。请注意 cy.window() 需要通过 window 公开变量。例如,您可以使用

将 axios 实例放在 window 上
const axiosMain = axios.create()
window.axiosMain = axiosMain

然后您可以使用

在 cypress 中访问 axiosMain
cy.window().then(win => {
    const { axiosMain } = win
    //... add interceptors here
}