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
相关产品推荐
相关产品推荐

