测试服务(WKC)
知名组件服务是使用 知名组件 架构,其中服务的每一部分都被模块化并封装在一个组件中。这些组件除了易于互换之外,还易于进行单元测试,因为它们的所有依赖项都会在创建时注入。
对这些服务进行测试应使用两种不同类型的测试, 单元 和 集成。包含逻辑的组件必须使用单元测试进行测试,而主要与外部服务交互的组件应使用集成测试进行测试。也就是说,一个不包含任何逻辑且主要包含数据库查询的数据库适配器组件必须通过集成方式测试。
知名组件组件的单元测试
所有组件都必须进行单元测试,并且必须按照此处定义的测试编写部分来编写。
为了展示这些组件如何被测试,这里有一个只有一个方法和两个依赖项的简单组件, 设置 和 好友:
// 语音组件
export function createVoiceComponent(dependencies: Pick<AppComponents, 'settings' | 'friends'>) {
const { settings, friends } = dependencies
async function canCallEachOther(caller: string, callee: string): Promise<boolean> {
const [callerSettings, calleeSetting] = Promise.all([settings.getPrivacySetting(caller), settings.getPrivacySetting(callee)])
const areFriends = await friends.areUsersFriends(caller, callee)
return areFriends || (callerSettings !== Settings.ONLY_FRIENDS && calleeSettings !== Settings.ONLY_FRIENDS)
}
return {
createVoiceChat
}
}为了测试这些组件,必须构建合适的 mock,也就是那些具有正确类型、能够与被测组件交互并且足够灵活以便我们创建各种测试的 mock。这些 mock 在不同测试之间也应该保持不可变,从而保留每个测试都在其自身上下文中执行、彼此隔离的理念。
这些 mock 应使用组件 mock 创建函数创建,并且应命名为 createComponentNameMockedComponent。以上面创建的组件为例,下面是它们应该如何呈现的示例:
通过将这些 mock 小心地放在一个 beforeEach中,我们可以确保这些 mock 在不同执行之间被正确隔离。下面是这些 mock 的使用示例:
这样定义 mock 的方式,不仅允许我们在不同执行之间正确隔离测试上下文,还为正确初始化上下文奠定了基础,因为 mock 函数已经定义好了,因此很容易构建每个上下文:
集成测试
所有端点、WS RPC 调用、作业或任务都必须进行完整集成测试,并且必须按照此处定义的测试编写部分来编写。集成测试必须放在 test/integration 目录中,并且必须根据我们要测试的入口点来命名。
集成测试应仅限于测试那些无法通过单元测试验证的特定集成条件(SQL 查询、Redis 操作等),以及我们逻辑组件与协议(HTTP、WS)之间的集成。
为了举例说明集成测试应如何编写,我们将测试一个用于获取用户好友的简单 HTTP 请求。
以及一个具有以下内容的 friends 组件:
最后更新于