首页 > 解决方案 > 如何在 Cypress 中使用与 Axios 相同的节点环境

问题描述

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

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

我试过这样做,但是当我从我的请求文件中导入 axios 实例时,我注意到我的请求文件中的任何 console.logs 都会打印两次。这意味着当 cypress 导入变量时,它会再次运行文件,这意味着 cypress 无法访问实际发出请求的 axios 实例,而是只有 cypress 使用的新实例。

当我打印 process.env.NODE_ENV 时,它会使用两个不同的值打印两次 柏树环境差异

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

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

并在我的测试文件顶部运行它,process.env.NODE_ENV = Cypress.env('NODE_ENV')但这不起作用。我也尝试export NODE_ENV = development在我称之为 cypress 的终端中,但没有奏效。这也是我用来调用 cypress 的 package.json 中的脚本,我使用的"cypress": "./node_modules/.bin/cypress open"是 cypress 3.1.0 和节点 9.5.0

甚至有可能让柏树与变量交互吗?我只是有我的柏树或节点设置错误吗?

标签: node.jsaxioscypress

解决方案


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

const axiosMain = axios.create()
window.axiosMain = axiosMain

然后您可以使用 cypress 访问 axiosMain

cy.window().then(win => {
    const { axiosMain } = win
    //... add interceptors here
}

推荐阅读