Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Cypress:我们如何在Cypress中使用承载令牌写入GET请求?_Javascript_Networking_Get_Request_Cypress - Fatal编程技术网

Javascript Cypress:我们如何在Cypress中使用承载令牌写入GET请求?

Javascript Cypress:我们如何在Cypress中使用承载令牌写入GET请求?,javascript,networking,get,request,cypress,Javascript,Networking,Get,Request,Cypress,我有两个请求:一个是POST请求,另一个是get请求。首先,我通过post获得用户访问令牌,而在另一种情况下,我使用这个访问令牌来获得登录。我的代码不起作用 我正在使用Windows7和Cypress3.3.5 我的代码: var value; describe("Login operation", () => { it("Login Request with post method", () => { cy.request({

我有两个请求:一个是POST请求,另一个是get请求。首先,我通过post获得用户访问令牌,而在另一种情况下,我使用这个访问令牌来获得登录。我的代码不起作用

我正在使用Windows7和Cypress3.3.5

我的代码:

var value;
describe("Login operation", () => {
  it("Login Request with post method", () => {
    cy.request({
      method:'POST', 
      url:'https://odms.baitussalam.org:8445/api/v1/auth/login',
      body: {
        "userName": "faizanj",
        "password": "abc"
      }
    })
      .then(function(response){
        this.value = response.body.accessToken;
        console.log("Value "+this.value);

        expect(response.body.name).to.equal('Faizan');
        expect(response.status).to.equal(200);
      });
  });

  it('Second test case', function() {

    var authHeader='bearer ${'+this.value+'}';
    const options = {
      method: 'GET',
      url: `https://odms.baitussalam.org:8445/api/v1/qurbani-representative`,
      headers:{
        authorization:authHeader,
      }};

    cy.request(options)
      .then((response)=>{
        expect(response.status).to.equal(200);6+9
      });
  });
});

问题是,您正在尝试在测试用例之间使用变量集,而该变量集已经重置为存储令牌,您需要使用全局变量(不建议),或者创建一些登录命令,在您需要访问令牌之前将调用这些命令。例如:

Cypress.Commands.Add('login',(用户名,密码)=>{
赛义德请求({
方法:'POST',
网址:'https://odms.baitussalam.org:8445/api/v1/auth/login',
正文:{
用户名,
密码,
}
})
.as('loginResponse')
。然后((响应)=>{
Cypress.env('token',response.body.accessToken);//要么是这个,要么是某个全局变量,但请记住,这只在一个测试用例中起作用
返回响应;
})
.its(“状态”)
.should('eq',200);
})
然后,在使用
Cypress.env('token')
之前,无论何时需要登录用户

例如:

description('测试令牌',()=>{
在每个之前(()=>{
cy.login();
});
它('测试请求',()=>{
const token=Cypress.env('token');
const authorization=`bearer${token}';
常量选项={
方法:“GET”,
网址:`https://odms.baitussalam.org:8445/api/v1/qurbani-代表`,
标题:{
授权,
}};
cy.request(选项)
.its(“状态”)
.should('eq',200);
})
});
您可以进一步覆盖所有请求,向其添加令牌,如下所示:

Cypress.Commands.overwrite('request',(originalFn,…选项)=>{
常量optionObject=选项[0];
const token=Cypress.env('token');
if(!!令牌和选项对象===对象(选项对象)){
optionsObject.headers={
授权:“持票人”+代币,
…选项Object.headers,
};
返回原始alfn(选项对象);
}
返回原始值(…选项);
});
那么上面的示例将如下所示:

description('测试令牌',()=>{
在每个之前(()=>{
cy.login();
});
它('测试请求',()=>{
cy.request(选项)
.its(“状态”)
.should('eq',200);
})
});

尝试在第二次测试中放置一个
console.log(this.value)
,查看标题是否使用了该值。我认为您不需要在
值前面添加
这个。
,但您可以这样确认。请求覆盖似乎不起作用。如果我和cy.request(url,{Headers:{Authorization:'Bearer'+token})一起执行,它会工作。请给出建议。@a2441918如果您正确设置了
Cypress.env('token'),您可以尝试调试
在overwrite中,如果您需要在
cy.request
中单独添加它,它可能是空的。如果是这种情况,您需要在运行任何
cy.request之前运行
cy.login();
(如上定义)