【发布时间】:2020-11-25 00:26:25
【问题描述】:
在 Cypress 中,您可以通过 well-documented 为特定的网络请求设置别名,然后您可以“等待”这些请求。如果您想在特定网络请求触发并完成后在 Cypress 中执行某些操作,这将特别有用。
以下来自赛普拉斯文档的示例:
cy.server()
cy.route('POST', '**/users').as('postUser') // ALIASING OCCURS HERE
cy.visit('/users')
cy.get('#first-name').type('Julius{enter}')
cy.wait('@postUser')
但是,由于我在我的应用程序中使用 GraphQL,因此别名不再是一件简单的事情。这是因为所有 GraphQL 查询共享一个端点 /graphql。
尽管单独使用 url 端点无法区分不同的 graphQL 查询,但是可以使用 operationName 区分 graphQL 查询(请参阅下图)。
仔细阅读文档后,似乎没有办法使用请求正文中的 operationName 为 graphQL 端点设置别名。我还将operationName(黄色箭头)作为我的响应标头中的自定义属性返回;但是,我也没有设法找到一种方法来使用它来为特定的 graphQL 查询设置别名。
方法 1 失败:此方法尝试使用图中显示的紫色箭头。
cy.server();
cy.route({
method: 'POST',
url: '/graphql',
onResponse(reqObj) {
if (reqObj.request.body.operationName === 'editIpo') {
cy.wrap('editIpo').as('graphqlEditIpo');
}
},
});
cy.wait('@graphqlEditIpo');
此方法不起作用,因为graphqlEditIpo 别名是在运行时注册的,因此我收到的错误如下。
CypressError: cy.wait() 找不到“@graphqlEditIpo”的注册别名。可用的别名有:'ipoInitial, graphql'。
失败的方法 2:此方法尝试使用图中所示的黄色箭头。
cy.server();
cy.route({
method: 'POST',
url: '/graphql',
headers: {
'operation-name': 'editIpo',
},
}).as('graphql');
cy.wait('graphql');
此方法不起作用,因为 cy.route 的选项对象中的 headers 属性实际上是为了接受每个 docs 的存根路由的响应标头。在这里,我试图用它来识别我的特定 graphQL 查询,这显然是行不通的。
这让我想到了我的问题:如何在 Cypress 中为特定的 graphQL 查询/突变设置别名?我错过了什么吗?
【问题讨论】:
-
赛普拉斯现在有关于如何支持 graphql 的文档,包括一些实用功能:[链接]docs.cypress.io/guides/testing-strategies/…