【问题标题】:Cypress preventing API call from finishing赛普拉斯阻止 API 调用完成
【发布时间】:2021-08-11 15:28:02
【问题描述】:

我有一个奇怪的问题。我有一个正在发送 API 的页面(我同时使用 async/await$.ajax().then 进行测试)。

就其本身而言,它工作得非常好,在awaitthen 触发之后的代码。但是,它在通过 Cypress 运行时不起作用。尽管网络选项卡显示 API 已成功,但没有代码继续运行,这意味着 console.log 永远不会被调用。

最初,我正在拦截 API,所以我认为这是问题所在,但现在,删除 .intercept 也无济于事。我应该从哪里开始寻找?

一些相关代码:

//testing
describe('The feature', () => {
before(() => {
    cy.loginAsAdmin();
    // 01-Aug-2021
    cy.clock(1627740000000);
    cy.visit('/dataChecking');
});

beforeEach(() => {
    Cypress.Cookies.preserveOnce('PHPSESSID');
    cy.reload();
});

after(() => {
    cy.clearCookies();
});

describe.only('when no data is return', () => {
    it('will show no error box', () => {
        cy.intercept(
            'POST',
            '/dataChecking/forStore',
            // {
            //  body: {
            //      data: [],
            //  },
            //  delay: 5000,
            // },
        ).as('api');

        cy.get('#store-id').type('1');
        cy.get('#submitBtn').click();

        cy.wait('@api').then(() => {
            cy.get('#no-error-message').should('be.visible');
        });
    });
});

});

// Page code
$.ajax({
        url: '/dataChecking/forStore',
        method: 'POST',
        data: {
            storeId,
            from: from.toString(),
            to: to.toString(),
        },
    }).then((msg) => {
        console.log(msg);
    });

    const { data } = await $.ajax({
            url: '/dataChecking/forStore',
            method: 'POST',
            data: {
                storeId,
                from: from.toString(),
                to: to.toString(),
            },
        });
    console.log('hello');

网络标签中的 API

【问题讨论】:

  • 您应该在then 之后创建一个catch 块,以查看$.ajax 是否抛出错误。

标签: javascript testing cypress


【解决方案1】:

拦截需要url匹配

it('will show no error box', () => {

  cy.intercept('POST', '/dataChecking/forStore').as('api')

  cy.get('#store-id').type('1');
  cy.get('#submitBtn').click();

  cy.wait('@api').then(() => {
    cy.get('#no-error-message').should('be.visible');
  });
});

或者你可能需要

cy.intercept('POST', '**/dataChecking/forStore').as('api')

【讨论】:

  • 你的代码和我的有什么不同?此外,问题不在于拦截,而在于 cypress 在处理 API 时的行为
  • 是的,我正瞪大眼睛——虽然你错过了网址。
  • 但是有些事情没有意义 - 你的代码中的async/await 在哪里?而没有代码继续运行这是什么意思?请更准确地解释错误。
  • 我只放了ajax,因为我认为它是一样的,只是在其中添加了async/await。我还解释了“不继续运行”的含义。请看一看 :)。 Tks
  • 好的,这很有道理。我试图重现,但对我来说工作正常(使用存根,因为没有设置 api)。 cy.wait('@api') 成功,console.log(msg) 显示 {data: Array(0)}
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多