有没有办法从 GraphQL 模拟订阅?我只需要返回一些数据一次。因此,几乎不用订阅,而是使用
GET
查询。
我确实查看了Cypress-Documentation,但我只看到了一些有关查询和突变的内容。
订阅使用
wss
而不是 https
协议,并且不是 POST
方法。因此,我认为不可能使用
cy.intercept('POST', 'http://localhost:3000/graphql', (req) => {...})
请求模拟的风格。
对于 GraphQL 请求,我使用 React Apollo 库。
奇怪的是我在这个方向上没有发现任何东西。我是 E2E 测试的新手,所以也许我的思维过程是错误的。
我正在使用 Cypress v13。
这里有一个带有自定义命令的问题线程模拟 websockets #2492 显然对作者有用,并且有 7 个拇指。
import { Server, WebSocket } from "mock-socket"
const mockGraphQlSocket = new Server(Cypress.env("GRAPHQL_WEB_SOCKET"))
Cypress.Commands.add("mockGraphQLSocket", mocks => {
cy.on("window:before:load", win => {
win.WebSocket = WebSocket
mockGraphQlSocket.on("connection", socket => {
socket.on("message", data => {
const { id, payload } = JSON.parse(data)
if (payload && mocks.hasOwnProperty(payload.operationName)) {
mocks[payload.operationName](
// Delegate the socket send call to the party owning the mock data since multiple calls might need to be made (for example to update multiple individual entries)
data =>
socket.send(
JSON.stringify({
type: "data",
id,
payload: { errors: [], data }
})
),
payload.variables
)
}
})
})
})
})
测试中
cy.mockGraphQLSocket({
yourGraphQlQuery: (send, { uuids }) => {
uuids.forEach(id => {
send({
yourGraphQlQuery: {
...yourMockData,
id
}
})
})
}
})