在赛普拉斯,在测试之前在localStorage中设置一个令牌

时间:2018-06-12 15:25:05

标签: browser e2e-testing cypress

我想登录并在客户端设置localStorage令牌(具体为jwt

如何按照赛普拉斯文档中的建议使用cy.request完成此操作?

5 个答案:

答案 0 :(得分:23)

以下是添加可在任何赛普拉斯测试中使用的命令cy.login()的示例,或放入beforeEach挂钩。

Cypress.Commands.add('login', () => { 
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: 'jake@jake.jake',
        password: 'jakejake',
      }
    }
  })
  .then((resp) => {
    window.localStorage.setItem('jwt', resp.body.user.token)
  })

})

然后在你的测试中:

beforeEach(() => {
  cy.login()
})

答案 1 :(得分:1)

我已经使用了一些类似bkuceras的答案。最近,在整个测试中测试多个角色/登录时遇到了一个问题。基本上发生的事情是我以管理员身份登录并进行一项测试,然后以非管理员身份登录并进行第二项测试。第一个测试运行良好并结束(赛普拉斯清除了本地存储),但是,第二个测试开始时,第一个测试仍然有一些xhr请求正在运行。这些xhr请求不再看到触发我的应用程序以查看401未经授权错误并清除本地存储的令牌(包括我设置的非管理员令牌)。现在第二次测试失败,因为该非管理员令牌在本地存储中不可用。

最终我的解决方案是在测试之前预取令牌,然后在访问的onBeforeLoad函数中设置令牌。这样可以确保在您的访问命令之前,任何竞争条件都不会清除令牌。

cy.visit('/app', {
    onBeforeLoad: function (window) {
        window.localStorage.setItem('token', myToken);
    }
})

这真的是一个非常独特的优势案例,但是我希望它可以对某人有所帮助,因为我已经花了很多时间来寻找这种解决方案。

答案 2 :(得分:0)

另外,您还可以使用this包在测试之间持久化localStorage,因此登录请求将仅发出一次:

在support / commands.js中:

import "cypress-localstorage-commands";

Cypress.Commands.add('login', () => { 
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: 'jake@jake.jake',
        password: 'jakejake',
      }
    }
  })
  .its('body')
  .then(body => {
    cy.setLocalStorage("jwt", body.user.token);
  })
});

然后,在您的测试中:

before(() => {
  cy.login();
  cy.saveLocalStorage();
});

beforeEach(() => {
  cy.restoreLocalStorage();
});

答案 3 :(得分:0)

我认为应该为此主题更新标题。 JWT令牌是此讨论的主要内容!

主要问题是有关JWT令牌的,但总的来说,所有现代应用程序都使用OIDC Microsoft article - v2-protocols-oidc / ADAL,这是一个非常棘手的情况,仅通过API调用生成令牌即可获得访问权限。 我发现here enter image description here 并会通过我的应用进行检查。但是请确保您在JS方面很出色,并在DevTeam的帮助下获得了很好的帮助;)

答案 4 :(得分:-1)

我花了很多时间在此上,最后我可以肯定地说,它永远无法用于OAuth请求。

它可能适用于本地服务器,但当您获得身份验证令牌时无效。