You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript编写Cypress API测试遇删除接口404,求解决及传参方法

联系人API测试问题:删除接口404错误+跨用例传递ID的实现

一、删除接口404错误的原因及修复

你的删除步骤返回404,核心原因是updateContact环节未返回contactId,导致后续delete时传入的ID为undefined。

看你代码里的update环节:

.then((contactId) => {
    updateContact(
        contactId,
        {
            'name':'newname',
        },
        HeadersType.contentJSON,
    )
        .then(({status, body}) => {
            expect(status).to.eq(200);
            expect(body.name).to.eq("newname");
        })
    // 此处未返回contactId,promise链传递的下一个值为undefined
})

这个then块没有返回任何值,导致后续删除步骤拿到的contactId是undefined,调用delContact(undefined, ...)自然找不到对应联系人,返回404。

修复代码:

.then((contactId) => {
    // 外层需要return updateContact的promise,保证链不中断
    return updateContact(
        contactId,
        {
            'name':'newname',
        },
        HeadersType.contentJSON,
    )
        .then(({status, body}) => {
            expect(status).to.eq(200);
            expect(body.name).to.eq("newname");
            return contactId; // 关键:返回ID供后续删除步骤使用
        })
})

二、跨测试用例传递ID的实现示例

如果需要将创建的contactId在多个it测试用例中复用,可以用以下两种方法:

方法1:使用全局变量+before钩子

import { getContactList, delContact, createContact, updateContact } from "../base/RequestType";
import { HeadersType } from "../base/HeaderType";
import * as url from '../../fixtures/Url.json';

describe('mfax Api end-points', () => {
    let contactId;

    // 在所有用例执行前创建联系人,存储ID
    before(() => {
        createContact(url.endpoint.createcontact, HeadersType.contentJSON)
            .then(({ body }) => {
                contactId = body.uuid;
            });
    });

    it('验证联系人存在于列表', () => {
        getContactList(url.endpoint.getcontacts, HeadersType.contentJSON)
            .then(({ body }) => {
                const filteredContact = body.rows.find(contact => contact.uuid === contactId);
                expect(filteredContact).to.exist;
            });
    });

    it('更新联系人信息', () => {
        updateContact(
            contactId,
            { name: 'newname' },
            HeadersType.contentJSON,
        )
        .then(({ body }) => {
            expect(body.name).to.eq('newname');
        });
    });

    it('删除联系人', () => {
        delContact(contactId, HeadersType.contentJSON)
            .then((resp) => {
                expect(resp.status).to.eq(204);
            });
    });
});

方法2:使用Cypress别名

import { getContactList, delContact, createContact, updateContact } from "../base/RequestType";
import { HeadersType } from "../base/HeaderType";
import * as url from '../../fixtures/Url.json';

describe('mfax Api end-points', () => {
    before(() => {
        createContact(url.endpoint.createcontact, HeadersType.contentJSON)
            .then(({ body }) => {
                // 将ID存为别名
                cy.wrap(body.uuid).as('contactId');
            });
    });

    // 注意:使用this获取别名时,用例必须用普通function,不能用箭头函数
    it('验证联系人存在于列表', function() {
        getContactList(url.endpoint.getcontacts, HeadersType.contentJSON)
            .then(({ body }) => {
                const filteredContact = body.rows.find(contact => contact.uuid === this.contactId);
                expect(filteredContact).to.exist;
            });
    });

    it('更新联系人信息', function() {
        updateContact(
            this.contactId,
            { name: 'newname' },
            HeadersType.contentJSON,
        )
        .then(({ body }) => {
            expect(body.name).to.eq('newname');
        });
    });

    it('删除联系人', function() {
        delContact(this.contactId, HeadersType.contentJSON)
            .then((resp) => {
                expect(resp.status).to.eq(204);
            });
    });
});

关键注意事项

  • 用before钩子在所有用例前创建一次联系人,避免重复请求;如果需要每个用例独立隔离,可以改用beforeEach。
  • 使用this访问别名时,测试用例必须定义为普通函数(function()),箭头函数会丢失Cypress的上下文,无法获取this中的别名。

内容的提问来源于stack exchange,提问作者Just_curious_tester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:55:32