Cypress.io - 根据 cy.route() 中的请求参数以编程方式设置响应

Posted

技术标签:

【中文标题】Cypress.io - 根据 cy.route() 中的请求参数以编程方式设置响应【英文标题】:Cypress.io - Programmatically set response based on request parameters in cy.route() 【发布时间】:2019-01-29 05:14:26 【问题描述】:

我在端到端测试中存根 api 请求,并希望能够根据发出的请求参数返回不同的响应。

目前,无论发布什么内容,我的存根都会返回静态响应,如下所示:

cy.server()
cy.route(
    method: 'POST',
    url: '**/redeem-code',
    status: 200,
    response: 
        status: "Success"
    ,
    delay: 500
)

我希望能够检查发布的请求参数,然后有条件地决定返回哪个响应。我正在尝试做这样的事情:

cy.server()
cy.route(
    method: 'POST',
    url: '**/redeem-code',
    status: 200,
    response: (req) => 
        if(req.code == '1234') return  status: "Success" 
        else return  status: "Failure" 
    ,
    delay: 500
)

显然,上面的代码不起作用;这只是我正在尝试做的一个例子。

我知道 Cypress 允许使用响应方法,但我在他们的文档中的任何地方都找不到我想要做的事情的语法。如何在我的响应方法中获取请求参数,以便决定返回哪个响应?

【问题讨论】:

EMAcsVI,你找到解决方案了吗?我也面临同样的问题 我也在寻找解决方案。 快到了 (github.com/cypress-io/cypress/pull/4176) 【参考方案1】:

遗憾的是,cy.server 目前不支持此功能。

问题正在这里跟踪:https://github.com/cypress-io/cypress/issues/521

解决方法

使用标准的 javascript 模拟。您可以使用 cypress onBeforeLoad 在测试中运行这个模拟,在 linked issue 中提到过几次。它不漂亮。希望 cypress 在 cy.server 中获得原生支持。

【讨论】:

【参考方案2】:

我遇到了同样的问题,并做了一个功能来启用它。它确实需要一个反弹网址,但可以在此处查看代码安装说明https://bitbucket.org/snippets/matt-tasc/onraxo

【讨论】:

【参考方案3】:

我相信这应该可行

cy.server(
        onResponse: ( status, url, response ) => 
             if(url !== 'yoururl') return response;
             return  
                ...response,
               body:  status: status === 1234 ? 'success' : 'failure' 
             ;
            
);

【讨论】:

感谢您的建议。你非常接近,但没有雪茄。有关详细信息,请参阅我更新的问题。

以上是关于Cypress.io - 根据 cy.route() 中的请求参数以编程方式设置响应的主要内容,如果未能解决你的问题,请参考以下文章

Cypress下载及安装介绍

Cypress下载及安装介绍

Cypress.io 如何处理异步代码

访问新窗口 - cypress.io

如何使用 Cypress.io 检查元素是不是存在

Cypress.io 代码覆盖率发布到 azure devops