Hammox迁移清单:Mox用户如何3步无痛升级到自动化契约测试
Hammox迁移清单Mox用户如何3步无痛升级到自动化契约测试【免费下载链接】hammox automated contract testing via type checking for Elixir functions and mocks项目地址: https://gitcode.com/gh_mirrors/ha/hammoxHammox 是一个面向 Elixir 函数的自动化契约测试库它在 Mox 的基础上更进一步不仅帮你创建 mock还会基于 behaviour 的 typespec自动校验mock 和真实实现是否守约。如果你正在使用 Mox本文将给你一份 3 步迁移清单让你无痛升级到 Hammox让契约 bug 在测试阶段就暴露出来。为什么需要 HammoxMock 也会背叛契约很多 Elixir 开发者都知道单元测试里用 mock 替代真实依赖是好习惯。但 Mox 有一个盲区它不检查 typespec。举个例子你的Databasebehaviour 约定返回{:ok, [binary()]}某天重构后实现改了但 mock 还在返回裸列表[joe, jim]——测试依然全绿上线却会炸 。换成 Hammox 后同样的测试会立刻报出清晰的错误** (Hammox.TypeMatchError) Returned value [joe, jim] does not match type {:ok, [binary()]} | {:error, term()}.错误信息由 lib/hammox/type_match_error.ex 生成参数、返回值、元组元素、map 键值……每个不匹配点都会用人类可读的话说明方便快速定位。类型匹配引擎的实现在 lib/hammox/type_engine.ex。 一句话总结Mox 管mock 怎么调Hammox 额外管mock 和实现是否遵守同一份契约。3步迁移清单从 Mox 到 Hammox 完整升级步骤第 1 步一行替换依赖——最快 mix.exs 配置方法在 mix.exs 中删掉:mox加入:hammoxdef deps do [ {:hammox, ~ 0.7, only: :test} ] end注意Hammox 本身就依赖 Mox见项目 mix.exs 的deps/0所以两者可以共存不需要担心兼容问题。第 2 步全局把 Mox 替换为 Hammox零成本开启类型检查这一步是无痛的关键——只需全局查找替换Mox为Hammox无需任何其他改动。原 Mox 用法替换后变化import Moximport Hammox直接替换defmock(Foo, for: Bar)defmock(Foo, for: Bar)API 完全相同expect(mock, :fn, fn ...)同左自动附加 typespec 检查 ✅stub / verify! / allow同左API 完全相同所有兼容函数都在 lib/hammox.ex 中定义defmock/2、set_mox_from_context/1等直接委托给 Mox而expect/4、stub/3会在原函数外包一层 typespec 校验对应源码中的wrap/3。替换完成后运行一次mix test——如果你的 mock 早就违反了契约现在就能被逮住 。第 3 步用 Hammox.protect 给真实实现也加上契约保护第 2 步只保护了 mock。Hammox 的真正目标是让behaviour、mock、实现三者始终保持同步所以推荐给真实实现也加上检查。Hammox.protect/2会返回一个受保护的匿名函数调用时自动校验参数和返回值setup_all do %{get_users_0: Hammox.protect({RealDatabase, :get_users, 0}, Database)} end直接传入实现模块 behaviour 模块还能一次性保护所有回调返回的 map 天然适合放进setup_all。完整的多种用法批量保护、多 behaviour、快捷方式都在 lib/hammox.ex 的protect/2文档注释中。如果嫌显式写法啰嗦还可以用宏一步到位——在测试模块里use Hammox.Protect, module: RealDatabase, behaviour: Database就像import一样直接调用受保护函数实现见 lib/hammox/protect.ex。Hammox 升级后常见问题Dialyzer、协议类型与性能Q1我已经有 Dialyzer 了还需要 Hammox 吗需要。Dialyzer 是静态分析工具无法发现 Mox 风格 mock 违反 typespec 的问题Hammox 是运行时契约测试二者互补各有能抓住对方漏掉的 bug。Q2Protocol 类型是怎么检查的协议中定义的t()类型如Enumerable.t()会被理解为实现了该协议的 struct。传入:atom会得到明确报错Value :atom does not implement the Enumerable protocol.Q3某个 mock 想关掉契约检查怎么办直接把那个 mock 改回原版 Mox 即可——Hammox 依赖 Mox两者可以无摩擦混用适合渐进式迁移。Q4有什么已知限制typespec 中匿名函数类型目前只检查 arity不检查参数和返回类型。Q5测试套件很大Hammox 影响速度怎么办Hammox 内置了 Telemetry 事件[:hammox, :expect]、[:hammox, :check_call]等在配置中开启enable_telemetry?: true即可诊断性能瓶颈事件清单见 guides/Telemetry.md。迁移完成度核对清单提交 PR 前对照这份清单逐项打勾mix.exs 中已移除:mox加入{:hammox, ~ 0.7, only: :test}全局替换完成无残留的import Mox/Mox.调用mix test全绿若变红正是契约 bug 被捕获按TypeMatchError提示修复核心 behaviour 的callback均带有完整 typespec这是自动检查的依据关键真实实现已通过Hammox.protect/2加入setup_all推荐如需排查性能已按 guides/Telemetry.md 开启遥测总结3 步换来契约永不同步的免疫能力回顾一下这次无痛迁移的 3 步换依赖mix.exs中一行:mox→:hammox换名字全局Mox→Hammoxmock 立即获得 typespec 自动检查加保护用Hammox.protect把真实实现也纳入契约校验补全behaviour—mock—实现三角。整个过程几乎不改变你的测试写法却能让 mock 与实现之间的契约漂移在测试阶段就被拦截。想深入了解实现细节可以从 lib/hammox.ex、lib/hammox/protect.ex 和测试用例 test/hammox_test.exs 入手如需拉取完整源码研究仓库地址为 https://gitcode.com/gh_mirrors/ha/hammox 。现在就可以动手给项目的 Elixir mock 测试加上契约护栏吧 【免费下载链接】hammox automated contract testing via type checking for Elixir functions and mocks项目地址: https://gitcode.com/gh_mirrors/ha/hammox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Outfit 字体完全指南:9 种字重免费开源,4 种格式一次拿全

Outfit 字体完全指南:9 种字重免费开源,4 种格式一次拿全

Outfit 字体完全指南:9 种字重免费开源,4 种格式一次拿全 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit 是一款免费开源的几何无衬线字体,自带从 Thin…

2026/8/22 15:04:15 阅读更多 →
为什么BashSupport被退役?一款Bash语言支持插件的十年开源之旅与Pro版未来

为什么BashSupport被退役?一款Bash语言支持插件的十年开源之旅与Pro版未来

为什么BashSupport被退役?一款Bash语言支持插件的十年开源之旅与Pro版未来 【免费下载链接】BashSupport Bash and shell script language support for JetBrains IDEs. Please refer to www.bashsupport.com/news/bashsupport-pro-1.3/ for the reasons. 项目地址…

2026/8/23 16:15:37 阅读更多 →
MRL数据准备实战:用FFCV快速序列化ImageNet的完整指南(含write_imagenet.sh参数详解)

MRL数据准备实战:用FFCV快速序列化ImageNet的完整指南(含write_imagenet.sh参数详解)

MRL数据准备实战:用FFCV快速序列化ImageNet的完整指南(含write_imagenet.sh参数详解) 【免费下载链接】MRL Code repository for the paper - "Matryoshka Representation Learning" 项目地址: https://gitcode.com/gh_mirrors/m…

2026/8/22 15:04:15 阅读更多 →

最新新闻

人声模仿查询声音:微调策略如何跨越语义鸿沟实现精准检索

人声模仿查询声音:微调策略如何跨越语义鸿沟实现精准检索

你有没有试过,想找一个特定的声音,却怎么也描述不清楚?比如,你想找一段“风吹过竹林,竹叶沙沙作响,同时远处有隐约的鸟鸣”的音频,或者一段“老式打字机快速敲击,中间夹杂着纸张翻页…

2026/8/23 17:09:20 阅读更多 →
Fluent XAML Theme Editor 源码架构深剖:MVVM 分层、共享库与依赖注入完整拆解

Fluent XAML Theme Editor 源码架构深剖:MVVM 分层、共享库与依赖注入完整拆解

Fluent XAML Theme Editor 源码架构深剖:MVVM 分层、共享库与依赖注入完整拆解 【免费下载链接】fluent-xaml-theme-editor The Fluent Design XAML theme editor. 项目地址: https://gitcode.com/gh_mirrors/fl/fluent-xaml-theme-editor Fluent XAML Theme…

2026/8/23 17:09:20 阅读更多 →
深入LiteRT-LM:.litertlm模型文件格式全景揭秘

深入LiteRT-LM:.litertlm模型文件格式全景揭秘

深入LiteRT-LM:.litertlm模型文件格式全景揭秘 【免费下载链接】LiteRT-LM LiteRT-LM is Googles production-ready, high-performance, open-source inference framework for deploying Large Language Models on edge devices. 项目地址: https://gitcode.com/G…

2026/8/23 17:09:20 阅读更多 →
mirrors/ali-vilab/text-to-video-ms-1.7b社区问答:100个高频问题的技术解答汇总

mirrors/ali-vilab/text-to-video-ms-1.7b社区问答:100个高频问题的技术解答汇总

mirrors/ali-vilab/text-to-video-ms-1.7b社区问答:100个高频问题的技术解答汇总 【免费下载链接】text-to-video-ms-1.7b 项目地址: https://ai.gitcode.com/hf_mirrors/ali-vilab/text-to-video-ms-1.7b 本文围绕 ModelScope(达摩院&#xff0…

2026/8/23 17:09:20 阅读更多 →
Maka Agent深度研究功能怎么用?从联网调研到完整报告的流程全解析

Maka Agent深度研究功能怎么用?从联网调研到完整报告的流程全解析

Maka Agent深度研究功能怎么用?从联网调研到完整报告的流程全解析 【免费下载链接】maka Apache Maka (Incubating) is a local-first AI agent workspace. Model messages, tool calls, tool results, permission decisions, and termination events are recorded …

2026/8/23 17:09:20 阅读更多 →
信息学竞赛必备数学符号全解:从基础运算到复杂度分析

信息学竞赛必备数学符号全解:从基础运算到复杂度分析

1. 项目概述:为什么OI选手必须啃下数学符号这块硬骨头刚接触信息学竞赛(OI)那会儿,我总觉得算法和数据结构是硬核,数学符号不过是些花里胡哨的“装饰”。直到在赛场上,因为把一个求和符号Σ的下标看错&…

2026/8/23 17:08:20 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →