我们的应用程序正在大力开发中,我们的 API JSON 格式也在不断变化。这是一个简化的例子:
{
"succeeded": true,
"message": null,
"data": {
"purchaseOrderId": "1f7968e2-f18e-417b-9e7b-1c35e5bdd465",
"vendor": {
"vendorId": "7a76533d-9c8b-4ac0-85c0-df89eaa3cb0e",
"name": "Owens Brothers",
"number": "VND-8888"
},
"purchaseOrderNumber": 101
},
"errors": null
};
但后来我们知道我们需要包含其他信息:
{
"succeeded": true,
"message": null,
"data": {
"purchaseOrderId": "1f7968e2-f18e-417b-9e7b-1c35e5bdd465",
"vendor": {
"vendorId": "7a76533d-9c8b-4ac0-85c0-df89eaa3cb0e",
"name": "Owens Brothers",
"number": "VND-8888"
},
"buyer": {
"buyerId": "629f21c0-c27b-42d7-9a3e-bb5f9d7a268a",
"fullName": "Allen Armstrong"
},
"purchaseOrderNumber": 101
},
"errors": null
};
显然这“破坏”了测试。前端需要新格式,但从我存根的 API 调用中获取旧格式。
发生这种情况时,我通常会转到实时应用程序,将其置于正确填充我要测试的内容的状态,然后使用 Chrome 检查工具获取响应内容。
然后我有时会对其进行编辑,使其完全符合我的要求,并将其粘贴到我的 cypress 存根函数中。
这种事情有更好的工作流程吗?
如果您希望使用
buyer
分支更新夹具,同时保留已经模拟的值(例如 purchaseOrderId
值),您可以使用 lodash merge()
.
it('updates a fixture with new structure', () => {
const currentFixture = {
data: {
purchaseOrderId: 'mock-this-value', // mock is providing this value
vendor: {
vendorId: '7a76533d-9c8b-4ac0-85c0-df89eaa3cb0e',
},
purchaseOrderNumber: 101,
},
}
const newStructure = {
data: {
purchaseOrderId: '1f7968e2-f18e-417b-9e7b-1c35e5bdd465',
vendor: {
vendorId: '7a76533d-9c8b-4ac0-85c0-df89eaa3cb0e',
},
buyer: {
buyerId: '629f21c0-c27b-42d7-9a3e-bb5f9d7a268a',
},
purchaseOrderNumber: 101,
},
}
const revisedFixture = Cypress._.merge(newStructure, currentFixture)
// Does revised fixture have the new struture?
expect(revisedFixture.data).to.have.property('buyer') // passes
// Is the mocked value still present?
expect(revisedFixture.data.purchaseOrderId).to.eq('mock-this-value') // passes
})
要在测试中自动执行此操作,您需要让
intercept
查询服务器。
这是一个近似值,显然您需要调整应用程序的数据(JSON 解析等)
cy.fixture(fixtureName).then(fixture => {
cy.intercept(url, (req) => {
req.continue().then(res => {
const revisedFixture = Cypress._.merge(res, fixture)
res.send(revisedFixture)
})
})
})