ReactJS + Cypress E2E 测试

Posted

技术标签:

【中文标题】ReactJS + Cypress E2E 测试【英文标题】:ReactJS + Cypress E2E testing 【发布时间】:2019-08-22 12:54:42 【问题描述】:

对于任何有 React + Cypress 经验的人的快速问题 - 编写我的第一组 E2E 测试,这是困扰我的问题:

cy.visit('http://movinito.docker.localhost:3000/company/subcontractors');

有效,但是

cy.visit('/company/subcontractors');

没有按预期工作(登录后将我重定向到仪表板,并在我尝试断言包含“分包商”的路径名时停留在那里)。

我在 cypress.json 中的 baseUrl 是

"baseUrl": "http://react_frontend.movinito.docker.localhost:3000"

而且它通常有效(如果您怀疑是这样)。

我想使用更短、更好的版本 cy.visit('/company/subcontractors'); 而不是 baseUrl 的冗长的重新输入...

在我使用的 .visit 之前添加它可能很重要

cy.request('POST', 'http://movinito.docker.localhost/user/login?_format=json', name,pass);

[成功]登录...正如我所说,整个事情都有效,但我无法使用 baseUrl,必须使用 .visit 命令和完整的基于环境的 url...

这是 [工作] 完整测试代码

   describe('Subcontractors section', ()=> 
        it('renders properly', ()=> 
            const  name, pass  = name: 'info@batcave.com', pass: '123#456'

            cy.request('POST', 'http://movinito.docker.localhost/user/login?_format=json', 
                name,
                pass
            );

            cy.visit('http://movinito.docker.localhost:3000/company/subcontractors');
//    
// I want to replace the above line with cy.visit('/company/subcontractors')
//
            cy.location('pathname').should('include', '/company/subcontractors');
            cy.get('[data-cy=page-title]').should('have.text', 'Subcontractors');
        )
    );

【问题讨论】:

如果我错了,请纠正我:您提到这个有效:'http://movinito.docker.localhost:3000/company/subcontractors' 但这个无效:'http://react_frontend.movinito.docker.localhost:3000' 您正在使用两个不同的 URL。如果将第二个更改为:'http://movinito.docker.localhost:3000' 会发生什么 让我重新表达我的意思:我希望 baseUrl 与我传递给 cy.visit 函数的字符串连接。仅使用 cy.visit('/company/subcontractors') 会使我的测试卡在 dasbhoard 上,因为像这样传递完整的 url -> cy.visit('movinito.docker.localhost:3000/company/subcontractors') 按预期工作....我登录在并被重定向到我的分包商页面。为什么这里的行为有所不同?我想使用 cy.visit('/company/subcontractors') 所以我可以根据环境切换 baseUrl - 我不想每次都输入完整的 url。 【参考方案1】:

嗯,我阅读了有关 visit() 和 request() 的文档,这应该可以:

describe('Subcontractors section', ()=> 
  it('renders properly', ()=> 
    cy.visit(
      url: 'http://movinito.docker.localhost/user/login?_format=json',
      method: 'POST',
      body 
        name,
        pass
      
    )

    cy.visit('/company/subcontractors')
    cy.location('pathname').should('include', '/company/subcontractors')
  )
);

// cypress.json

  "baseUrl": "http://react_frontend.movinito.docker.localhost:3000"

【讨论】:

谢谢,但问题出在服务器和重定向上...react_frontend.movinito.docker.localhost:3000 和 movinito.docker.localhost:3000 在我的机器上是同义词,但 cypress 不这么认为,所以我只是删除了“react_frontend " 有点,它开始工作了......不过我已经接受了你的回答 - 谢谢你的意见! 检查,所以我们基本上回到了我昨天评论的重点:)。至少解决了。

以上是关于ReactJS + Cypress E2E 测试的主要内容,如果未能解决你的问题,请参考以下文章

使用 cypress.io 模拟 s-s-r 反应应用程序 e2e 测试的服务器

cypress初探

cypress初探

cypress初探

cypress初探

如何对接 NX cypress e2e 应用程序