Gomega能否验证最后返回值非error的多类型多返回值?
Gomega验证非error结尾多返回值的解决方案
针对你提到的func Load(key string) (value interface{}, ok bool)这类最后一个返回值不是error的多返回值函数,完全不需要修改生产代码,用Gomega可以通过以下两种方式完成验证:
1. 拆分返回值后分别断言
这是最直接、易读的方案,先调用函数获取所有返回值,再对每个值单独做断言:
value, ok := Load("target-key") Ω(value).Should(Equal(expectedValue)) // 验证value是否符合预期 Ω(ok).Should(BeTrue()) // 验证ok状态是否符合预期
2. 自定义匹配器(复杂复用场景适用)
如果需要在多个测试用例中复用这类多返回值的断言逻辑,可以自定义匹配器来同时验证两个返回值:
type loadResultMatcher struct { expectedValue interface{} expectOk bool } func MatchLoadResult(expectedValue interface{}, expectOk bool) *loadResultMatcher { return &loadResultMatcher{expectedValue: expectedValue, expectOk: expectOk} } func (m *loadResultMatcher) Match(actual interface{}) (success bool, err error) { resultFunc, ok := actual.(func() (interface{}, bool)) if !ok { return false, fmt.Errorf("actual must be a func() (interface{}, bool)") } val, actualOk := resultFunc() return val == m.expectedValue && actualOk == m.expectOk, nil } func (m *loadResultMatcher) FailureMessage(actual interface{}) string { return fmt.Sprintf("expected load result to be (%v, %t)", m.expectedValue, m.expectOk) } func (m *loadResultMatcher) NegatedFailureMessage(actual interface{}) string { return fmt.Sprintf("expected load result not to be (%v, %t)", m.expectedValue, m.expectOk) }
使用时直接传入函数调用的匿名包装:
Ω(func() (interface{}, bool) { return Load("target-key") }).Should(MatchLoadResult(expectedValue, true))
两种方案都无需改动生产代码,第一种适合简单测试场景,第二种适合需要重复验证相同逻辑的复杂场景。
内容的提问来源于stack exchange,提问作者user892960
相关产品推荐
相关产品推荐

