cy.intercept() 不在赛普拉斯中存根 API

sof*_*na 7 typescript cypress

当我使用 cy.intercept() 时,API 不会存根。

任何帮助将不胜感激,谢谢

cy.intercept('GET',
          `${API}farm/list`,
          {
         body:{           
               statusCode: 200,
               message: 'Request successful',
               result: seededFarmList
               }
          });
Run Code Online (Sandbox Code Playgroud)

我正在像这样导入夹具文件:

从'../../../../../fixtures/farm'导入{seedFarmList};

我的 API 响应如下所示:

{
 "statusCode": 200, 
"message": "Request successful", 
"result": 
[ 
  { "id": 1 "farmName": "ABCD", },
  { "id": 2 "farmName": "EFGH", }
]
}
Run Code Online (Sandbox Code Playgroud)

dar*_*mis 26

确保在应用程序进行 api 调用之前注册网络拦截。请注意cy.intercept是之前设置的cy.visit

it('is registered correctly', () => {
  cy.intercept('/todos').as('todos')
  cy.visit('/')
  cy.wait('@todos')
})
Run Code Online (Sandbox Code Playgroud)

在下面的示例中cy.intercept设置后cy.visit,这可能会失败。

 it('is registered too late, this might fail', () => {
    cy.visit('/')
    cy.intercept('/todos').as('todos')
    cy.wait('@todos')
  })
Run Code Online (Sandbox Code Playgroud)


小智 8

我不完全确定为什么它没有存根(假设您的意思是服务器响应正在通过?)。

无论如何,存根响应模式现在变得更加复杂,并且会让很多人陷入困境。

这是我对文档的解释,

在 中cy.route(method, url, response),响应记录为正文

为匹配路由中的存根提供响应主体。

在 中cy.intercept(method, url, routeHandler?),routeHandler 是一个更复杂的野兽。

RouteHandler(字符串|对象|函数|静态响应)

objectStaticResponse都是对象 - Cypress 通过查看对象键来区分,根据 this

如果传递没有 StaticResponse 键的对象,它将作为 JSON 响应正文发送。

静态响应键是

{
  fixture?: string
  body?: string | object | object[]
  headers?: { [key: string]: string }
  statusCode?: number
  forceNetworkError?: boolean
  delayMs?: number
  throttleKbps?: number
}
Run Code Online (Sandbox Code Playgroud)

由于您正在发送statusCode,因此您的对象StaticResponse,因此消息和结果应移至正文,

cy.intercept('GET',
  `${API}farm/list`,
  {
    statusCode: 200,
    body: {
      message: 'Request successful',
      result: seededFarmList
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

在我看来,他们有点过度设计了——从 StaticResponse 到对象(取决于键)的回退有点不必要。


我刚刚在示例规范中找到了一个示例network_requests.spec.js(在赛普拉斯第一次运行时添加)。

beforeEach(() => {
  cy.visit('https://example.cypress.io/commands/network-requests')
})

...

let message = 'whoa, this comment does not exist'

// Stub a response to PUT comments/ ****
cy.intercept({
  method: 'PUT',
  url: '**/comments/*',
}, {
  statusCode: 404,
  body: { error: message },                         // stub returns above message
  headers: { 'access-control-allow-origin': '*' },
  delayMs: 500,
}).as('putComment')

// we have code that puts a comment when
// the button is clicked in scripts.js
cy.get('.network-put').click()

cy.wait('@putComment')

// our 404 statusCode logic in scripts.js executed
cy.get('.network-put-comment').should('contain', message)
Run Code Online (Sandbox Code Playgroud)

  • 幸运的是,问题中没有提及 NextJS NuxtJS 或 SSR。 (14认同)
  • 这在带有 SSR 的 NextJS 中不起作用,因为请求是在服务器上发出的。赛普拉斯无法访问此内容。 (2认同)

Ric*_*sen 7

我设法使用 @eric99 给出的模式进行存根工作,

cy.intercept(
  'GET',
  'https://jsonplaceholder.typicode.com/todos/1',
  {
    statusCode: 200,
    body: {
      message: 'Request successful',
      result: ['my-data']
    }
  }
)
.as('typicode')

cy.visit('https://jsonplaceholder.typicode.com/')
cy.get('#run-button').click();

cy.wait('@typicode')
.then((interception) => {
  console.log('interception', interception)
})
Run Code Online (Sandbox Code Playgroud)

页面显示存根信息,

{
    "message": "Request successful",
    "result": [
        "my-data"
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 数据的格式与 cy.intercept() 函数是否存根无关(除非它存在语法问题,例如属性之间缺少逗号)。“body”属性上的任何格式良好的对象都应该返回到应用程序。看来您的“seedFarmList”有问题。 (2认同)