我正在尝试模拟赛普拉斯测试中的响应数据。具体来说,我想在发出 POST 请求删除某个项目时从装置中删除该项目。过滤掉该项目后,我想拦截后续的 GET 请求以加载更新的数据。但是,当我尝试在另一个 cy.intercept 中使用 cy.intercept 时遇到错误。
赛普拉斯错误:
Cypress 检测到您从命令返回了承诺,同时还 在该承诺中调用一个或多个 cy 命令。
这是我的代码:
// Remove an item from fixture
cy.fixture('items').then((items: any[]) => {
// Intercept the POST request to delete an item from the fixture
cy.intercept('POST', '**/delete', (request) => {
const itemId = request.body.itemId;
// Filter the items by removing the one that matches the request
const filteredItems = items.filter(item => item.id !== itemId);
// Here I get an error because I'm using intercept inside intercept
cy.intercept('GET', '**/loadData**', filteredItems).as('loadDataRequest');
}).as('delete');
});
如何修改测试以使用更新的夹具数据拦截 POST 请求和后续 GET 请求?
routerHandler(拦截 callnack
(req) => ...
)的触发与测试流程不同步,因此 Cypress 检查此函数中添加的命令。
由于您已经为
POST
指定了别名,因此您可以等待该别名并在其回调中设置第二个拦截。
为了检查它是否可行,我使用公共 API 运行了类似的测试。第一个调用接收 id
1
的数据,这用作第二个调用的模拟。
let dataFromFirstIntercept;
cy.intercept('https://jsonplaceholder.typicode.com/todos/1').as('first')
// Simulate the app firing the first API call
cy.window().then(win => {
win.fetch('https://jsonplaceholder.typicode.com/todos/1')
})
cy.wait('@first').then(({request, response}) => {
dataFromFirstIntercept = response.body
cy.intercept('https://jsonplaceholder.typicode.com/todos/2', dataFromFirstIntercept).as('second')
})
// Simulate app firing 2nd API call to different endpoint
cy.window().then(win => {
win.fetch('https://jsonplaceholder.typicode.com/todos/2')
})
cy.wait('@second').then(({request, response}) => {
expect(response.body).to.deep.eq(dataFromFirstIntercept)
})
最终断言确认模拟数据在第二次 API 调用中正确使用。