我正在编写测试,但我不太了解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);
}),
);
});
});
答案 0 :(得分:0)
如评论中所述
似乎有些时候您的响应正在以您尝试访问的方式获取JSON数据,但有时却没有。最好在尝试访问JSON不是固定结构的数据之前添加条件。
要使这些属性为可选,只需添加?
它将使属性选项
props: { authId?: string; deviceId?: string }
答案 1 :(得分:0)
我对您的问题不清楚。有一些很好的答案。
如果您要避免出现“未定义的错误属性”,则可以执行以下操作:
authId = response?.body?.result?.sessions[0]?.authId;
它可以防止错误。理想情况下,您将对它们全部进行类型检查。