在某些页面中,我们使用getInitialProps在后端请求调用外部端点。在CI/CD机器上,我们不能调用另一个端点,所以我们想模拟那个端点。**我试图集中模拟的服务器,所以我不需要在每次测试中初始化它。
在cypress.config.ts下,我看到我可以在e2 e属性下添加一个before:run事件,我相信它将创建一个端点,该端点将在测试中拦截对该端点的所有请求:
on('before:run', async (details) =>
await nock(/.*?(localhost:4000|{_another_endpoints_regex_here}).*?/)
.get('/api/')
.reply(200, {data:"data"})
})
我添加了一个正则表达式,因为请求的URL在环境之间发生了变化,我还启用了 experimentalInteractiveRunEvents 标志,我在那里添加了一个控制台日志,它显示在控制台上。我还将代码移到了我的页面中,并且它可以正常工作,所以我相信问题不是代码。
我想知道为什么nextjs的请求没有被嘲笑?这是一个与柏树或诺克有关的问题?
我得到的错误是:
data: {
message: 'request to http://localhost:4000/api/ failed, reason: connect ECONNREFUSED 127.0.0.1:4000',
type: 'system',
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED'
}
- 如果需要,我可以使用另一个框架来模拟请求
更新:我已经创建了一个新的隔离的nextjs端点和一个要测试的cypress测试。
更新2:在深入研究了整个项目之后,我认为问题在于我如何执行测试。我使用start-server-and-test包来运行项目,然后执行cypress。我相信这使得两个nodejs示例使cypress和nextjs处于不同的作用域,因此nextjs无法访问nock。我如何在不使用该包的情况下同时执行cypress和nextjs?
1条答案
按热度按时间lfapxunr1#
正如我在OP中提到的,看起来我不能使用nock,msw或其他任何东西来模拟cypress上的后端请求,因为我相信start-server-and-test创建了nodejs的不同示例,我相信这些模拟工具在最后所做的是修改fetch/http方法,但由于它们运行在不同的示例上,它们不会修改运行nextjs的示例的那些方法。
因此,我通过使用json-server创建一个在端口4000上运行的服务器来模拟服务器,并在nextjs端的.env.development中更改后端url,使其指向localhost:4000端点,并在cypress.config.ts中使用before:run在setupNodeEvents的e2 e属性中创建服务器,从而解决了我的问题