You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Mox的expect/4中实现字符串比较的彩色格式化输出?

在Mox expect回调中实现ExUnit式的字符串断言彩色diff

问题原因

Mox的expect/4回调中的断言失败时,异常处理路径与直接在test块内的断言不同——ExUnit的彩色diff格式化是在顶层测试上下文触发的,而回调内抛出的异常会被Mox捕获,跳过了ExUnit的完整错误格式化流程,导致丢失彩色diff输出。

解决方法

方法1:手动调用ExUnit的diff工具生成格式化错误

直接使用ExUnit.Assertions.diff/2生成标准格式的diff结果,手动抛出断言错误,让错误信息走ExUnit的格式化逻辑:

test "my test" do
  expect(MyMock, :post, fn data ->
    expected = "xyz"
    actual = data
    unless expected == actual do
      diff = ExUnit.Assertions.diff(expected, actual)
      raise ExUnit.AssertionError, message: "Expected strings to match:\n#{diff}"
    end
  end)

  # 触发mock调用的代码
end

这样抛出的错误会和直接在test块内的断言一样,输出带彩色的diff对比。

方法2:将断言移到test顶层(推荐)

通过Mox.capture/3捕获mock的调用参数,然后在test块内直接做断言,完全复用ExUnit的原生格式化能力:

test "my test" do
  # 捕获mock的调用参数
  captured_data = Mox.capture(MyMock, :post, fn ->
    # 这里执行触发mock调用的业务代码
  end)

  # 在test顶层做断言,自动生成彩色diff
  assert captured_data == "xyz"
end

替代方案

如果需要更复杂的结构化数据对比,可使用ExUnit.Assertions.assert_equal/2(针对嵌套结构),或者自定义断言函数封装diff逻辑,无需额外依赖第三方库。

内容的提问来源于stack exchange,提问作者José Ricardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:55:39