TypeError:无法读取未定义的属性“会话”

时间:2020-06-13 12:36:08

标签: javascript typescript jestjs testng supertest

我正在编写测试,但我不太了解js,但是我需要快速找到答案。在课程中,我尚未达到这一点,或者也许我听不懂。请帮助我弄清楚我在做什么错。

我有两个问题:

  • 删除行后,测试即开始工作

    .then((response) => {
       authId = response.body.result.sessions[0].authId;
    });
    

如果不删除此行,则会出现错误: TypeError: Cannot read property 'sessions' of undefined

  • 如何编写以使字段为可选字段,即您可以通过或不能通过

(props: { authId: string; deviceId: string })

这是我要解析的response.body:

{
  "result": {
    "sessions": [
      {
        "type": "web",
        "authId": "jRXtO7oNiBR5Ldeq",
        "platform": "platform",
        "application": "application",
        "seenAt": 1592052380
      }
    ],
    "integrations": []
  },
  "success": true
}

我的代码:

import { agent } from 'supertest';
import { config } from '../../config';
import { getSsoId } from '../../helpers/getUserFromGenesis';

describe('First', () => {
    let id;
    let authId;

    beforeEach(async () => {
        id = await getId();
    });

    const userAuthorizations = (fn: (response: any) => void) =>
        agent(config.baseUrl)
            .get(`users/${id}/authorizations?client_id=test`)
            .auth(config.user, config.pass)
            .expect((response) => {
                fn(response);
            });

    const deleteUserAuthorizations = (props: { authId: string; deviceId: string }) =>
        agent(config.baseUrl)
            .delete(`users/authorizations`)
            .auth(config.user, config.pass)
            .send(props)
            .expect((response) => {
                expect(response.body.result.success).toEqual(true);
            });

    const getSession = () =>
        agent(config.tokenQaUrl)
            .post(`/token`)
            .auth(config.user, config.pass)
            .send({
                clientId: 'test',
                userId: id,
            })
            .expect((response) => {
                expect(response.body.sessionId).not.toEqual('');
                expect(response.body.sessionId).not.toEqual(null);
            })
            .then((response) => {
                authId = response.body.result.sessions[0].authId;
            });

    it('test', async () => {
        await getSession().then(() =>
            userAuthorizations((response) => {
                expect(response.body.result.sessions.length).toBeGreaterThan(0);
            }),
        );
    });
});

2 个答案:

答案 0 :(得分:0)

如评论中所述

  1. 似乎有些时候您的响应正在以您尝试访问的方式获取JSON数据,但有时却没有。最好在尝试访问JSON不是固定结构的数据之前添加条件。

  2. 要使这些属性为可选,只需添加? 它将使属性选项 props: { authId?: string; deviceId?: string }

答案 1 :(得分:0)

我对您的问题不清楚。有一些很好的答案。

如果您要避免出现“未定义的错误属性”,则可以执行以下操作:

authId = response?.body?.result?.sessions[0]?.authId;

它可以防止错误。理想情况下,您将对它们全部进行类型检查。