当应用程序更新为期望新的 JSON 格式时,是否有一种方便的方法来更新存根 API 调用?

问题描述 投票:0回答:1

我们的应用程序正在大力开发中,我们的 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 存根函数中。

这种事情有更好的工作流程吗?

cypress stub datacontract cypress-intercept
1个回答
0
投票

如果您希望使用

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)
    })
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.