首页 > 解决方案 > 模拟笑话网络 - 我如何不干燥我的格式化程序?

问题描述

我有一个网络模块来 ping 具有多种格式数据的遗留数据库,我想在将它传递到应用程序之前在网络模块中对其进行标准化,以便我的应用程序可以期待某种格式的数据(不想要旧的,糟糕的格式污染了我的业务逻辑)。我正在努力解决如何作为这个网络模块传递模拟数据,特别是因为它与格式化程序有关。这就是我的意思:

// User API Network Module
// UserAPI.ts
export const getUser = (uid: String, callback: (GetUserResponse) => void): void => {
  // Do network call here and format the data into a typescript type
  // matching the GetUserResponse structure by business logic expects
  callback(formattedData)
}

在我的测试文件中,我可以轻松地模拟这个调用:

import { getUser } from "./UserAPI"
jest.mock("./UserAPI", () => ({
  getUser: (uid: String, callback: (GetUserResponse) => void) => {
    const mockedUserData = require("./mockUser.json")
    // But how do I format it here?
    return formattedMockedUserData
  },
}))

我可以在我的UserAPI.ts文件中创建一个格式化程序函数,将其导出,然后在开玩笑的模拟中运行它,但我想知道这是否是最佳实践,因为它在技术上泄露了UserAPI实现细节。我指出这一点只是因为没有其他文件关心UserAPIUserAPI. 如果我必须出于测试目的泄漏它,我会这样做。但是有没有更好的方法来模拟网络调用并通过格式化程序运行它而不暴露额外的实现细节?

请对我的打字稿温柔一点——我来自 JS 和强类型背景,但这是我第一次尝试使用打字稿 :)

标签: javascripttypescriptunit-testingjestjs

解决方案


即使它没有在多个地方使用,也可以按照单一责任原则将其提取到自己的结构中。您在 Formmater 测试中测试所有格式化逻辑,而不是在用户 API 测试中。此外,您可以在集成测试中测试 Formatter 与用户 API 的集成。


推荐阅读