如何精简测试返回含随机uuidv4属性的Promise结果?
问题
我正在测试一个返回如下结构对象的函数:
domainResult = { domainId: uuidv4, domainName: string, groupId: uuidv4, status: string }
函数内部会自动生成domainId对应的uuidv4,因此原本用的:
await expect(function(args)).to.eventually.become(domainResult)
方法无法生效,因为占位的domainId无法匹配实际生成的uuid。我目前的可行方法是先获取Promise结果再逐个断言属性:
result = await function(args); expect(result.domainId).to.be.a.uuid('v4'); expect(result.domainName).to.eq('myDomain') // 其他属性断言
但希望重构代码,让测试逻辑更精简。
精简测试的几种方案
1. 链式结合deep.include与UUID断言
利用Chai-as-promised的链式特性,不用提前await结果,直接在Promise断言链中同时验证固定属性和动态生成的UUID:
await expect(function(args)) .to.eventually.deep.include({ domainName: 'myDomain', groupId: '预期的groupId', // 如果groupId是已知固定值 status: '预期状态' }) .and.have.property('domainId') .that.is.a.uuid('v4');
这种方式既保留了Promise断言的简洁性,又精准验证了所有必要条件,代码紧凑且可读性强。
2. 自定义匹配器(复用场景)
如果多个测试用例都需要验证这种结构的对象,可以注册一个自定义Chai匹配器,一次定义多次使用:
// 注册自定义匹配器 chai.use(function(chai, utils) { chai.Assertion.addMethod('domainResult', function(expectedProps) { const result = this._obj; // 验证对象包含所有必要属性 new chai.Assertion(result).to.have.keys('domainId', 'domainName', 'groupId', 'status'); // 验证UUID格式 new chai.Assertion(result.domainId).to.be.a.uuid('v4'); // 验证固定属性值 new chai.Assertion(result.domainName).to.equal(expectedProps.domainName); new chai.Assertion(result.groupId).to.equal(expectedProps.groupId); new chai.Assertion(result.status).to.equal(expectedProps.status); }); }); // 测试中使用 await expect(function(args)) .to.eventually.be.a.domainResult({ domainName: 'myDomain', groupId: '预期的groupId', status: '预期状态' });
适合需要重复验证同结构对象的场景,能大幅减少冗余代码。
3. 使用satisfy灵活验证
如果只是单一测试用例,用satisfy传入验证函数,一次性完成所有检查:
await expect(function(args)).to.eventually.satisfy(result => { // 验证固定属性 const isMatch = result.domainName === 'myDomain' && result.groupId === '预期的groupId' && result.status === '预期状态'; // 验证UUID expect(result.domainId).to.be.a.uuid('v4'); return isMatch; });
这种方式灵活度高,适合快速编写一次性的验证逻辑。
内容的提问来源于stack exchange,提问作者BWilliams86
相关产品推荐
相关产品推荐

