能否在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
相关产品推荐
相关产品推荐

