添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
性感的仙人掌  ·  Jest Testing like a ...·  1 月前    · 
咆哮的小蝌蚪  ·  Expect · Jest·  1 月前    · 
骑白马的蚂蚁  ·  How to Use ...·  1 月前    · 
傻傻的熊猫  ·  ROG STRIX X470-F ...·  6 月前    · 
博学的紫菜汤  ·  中企纷纷入驻 ...·  7 月前    · 
失落的饭卡  ·  uniapp得到base64 - CSDN文库·  9 月前    · 

I am executing a collection using Runner on Postman version 7.14.0. As part of the Tests Script, I am validating the response header contents using:

tests[“Content-Type is present”] = postman.getResponseHeader(“Content-Type”).has(“application/json; charset=utf-8”);
tests[“X-Content-Type-Options is present”] = postman.getResponseHeader(“X-Content-Type-Options”).has(“nosniff”);
tests[“X-Frame-Options is present”] = postman.getResponseHeader(“X-Frame-Options”).has(“SAMEORIGIN”);
tests[“X-XSS-Protection is present”] = postman.getResponseHeader(“X-XSS-Protection”).has(“1; mode=block”);

However, I keep running into the TypeError complaining that the property ‘has’ is undefined. I understand that this is part of the Sandbox API, but is it not supported when I execute it via Runner?

Hi @pshivashankar !

.has is a method associated with Postman variables (i.e. pm.environment.has('name') ), it won’t work in your current implementation. Those assertions are also the old approach for writing tests in Postman.

I’d suggest writing your tests using the pm.test() method, and ChaiJS assertions like the following:

pm.test("content-type is application/json", function () {
    let responseHeadersJson = pm.response.json().headers;
    pm.expect(responseHeadersJson['content-type']).to.equal('application/json; charset=utf-8');

You can read more about writing tests in Postman on our Learning Center:

  • https://learning.getpostman.com/docs/postman/scripts/test-examples/#response-handling
  • …and here’s more about ChaiJS assertions:

  • https://www.chaijs.com/guide/styles/#expect
  • Hope that helps!

    Hi @john-paul: Please find the sample response and the code below:

    tests["Status code is 200"] = responseCode.code === 200;
    if(responseCode.code === 200) {
        var result = JSON.parse(responseBody);
    } else {
        console.log(responseHeaders);
        console.log(responseBody);
    pm.test("Body matches string", function () {
        pm.expect(pm.response.text()).to.include("bctoken");
        pm.expect(pm.response.text()).to.include("bcaccesskey");
        pm.expect(pm.response.text()).to.include("bcentitykey");
    pm.test("Set Globals", function () {
        var jsonData = pm.response.json();
        pm.environment.set("bctoken", jsonData["bctoken"]);
        pm.environment.set("bcaccesskey", jsonData["bcaccesskey"]);
        pm.environment.set("bcentitykey", jsonData["bcentitykey"]);
    pm.test("Validate Data", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData["bcaccesskey"]).to.eql(pm.environment.get("bcaccesskey"));
        pm.expect(jsonData["bcentitykey"]).to.eql(pm.environment.get("bcentitykey"));
        pm.expect(jsonData["bctoken"]).to.eql(pm.environment.get("bctoken"));
    pm.test("Content-Type is present", function() {
        let responseHeadersJson = pm.response.headers.all();
        pm.expect(responseHeadersJson['Content-Type'].to.equal('application/json; charset=utf-8'));
                  

    @pshivashankar try this and let me know if it works:

    pm.test("content-type is application/json", function () {
        let responseHeaders = pm.response.headers.all();
        let index = -1;
        for(var i = 0; i < responseHeaders.length-1; i++)
            console.log(responseHeaders[i]);
            if(responseHeaders[i].key === 'Content-Type')
                index = i;
                break;
        pm.expect(index).to.not.equal(-1);
        pm.expect(responseHeaders[index].value).to.equal('application/json; charset=utf-8');
    

    pm.response.headers.all() returns an array of objects, so you’ll need to iterate through it by some means to find the correct index containing the content-type header. responseHeadersJson['Content-Type'] won’t work because of this.

    Hi @john-paul,

    The new function didn’t work either. I am now getting an error - responseHeaders[index].value.to.equal is not a function. The code snippet is shown below along with the snapshot of the error:

    pm.test("Content-Type is present", function() {
        let responseHeaders = pm.response.headers.all();
        let index = -1;
        for(var i = 0; i < responseHeaders.length-1; i++){
            console.log(responseHeaders[i]);
            if(responseHeaders[i].key === 'Content-Type'){
                index = i;
        pm.expect(index).to.not.equal(-1);
        pm.expect(responseHeaders[index].value.to.equal('application/json; charset=utf-8'));
    

    Is there no way to extract each of the header if we don’t want it all together in an array format? The previous method of accessing each via pm.response.json().headers; resulted in the TypeError.

    pshivashankar:

    pm.expect(responseHeaders[index].value.to.equal(‘application/json; charset=utf-8’));

    Looks like you’re missing a parenthesis after .value. This line should be:
    pm.expect(responseHeaders[index].value).to.equal('application/json; charset=utf-8');

    In your case, jsonData doesn’t have the data property, so trying to access data’s own username property will cause an error, not simply fail the test. Add this before your other expect:
    pm.expect(jsonData).to.have.property("data");