gpt4 book ai didi

go - 比较 Go 中的 2 个错误进行单元测试

转载 作者:行者123 更新时间:2023-12-04 07:43:53 31 4
gpt4 key购买 nike

我遇到了如下问题:在编写单元测试时比较 2 个错误

package main

import (
"errors"
"fmt"
"reflect"

"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)

func main() {
er1 := errors.New("database name is not exists")
er2 := errors.New("database name is not exists")

result1 := reflect.DeepEqual(er1, er2)
fmt.Println("reflect: ", result1)

result2 := cmp.Equal(er1, er2, cmpopts.EquateErrors())
fmt.Println("compare: ", result2)

result3 := errors.Is(er1, er2)
fmt.Println("errorIs: ", result3)
}
上面代码的输出是:
reflect:  true
compare: false
errorIs: false
我想比较 2 个错误和 reflect.DeepEqual(er1, er2)是我应用的第一种方法,这种方法产生了我想要的输出,但是这种方法有来自 go lint 的警告:
avoid using reflect.DeepEqual with errorsdeepequalerrors
谷歌搜索后,有些人告诉我一些方法是:
  • 使用 cmp 包进行比较:cmp.Equal(er1, er2, cmpopts.EquateErrors())
  • 使用错误包进行比较:errors.Is(er1, er2)

  • 但是上述两种方法都不能产生与第一种方法相同的结果(使用reflect.DeepEqual)。
    我如何在没有警告的情况下比较 2 个错误 go lint并产生类似 reflect.DeepEqual 的结果
    塔克斯

    最佳答案

    根据您编写测试的方式,您可能依赖于 reflect.DeepEqual()并忽略 linter 警告;
    缺点是:你开始取决于你返回的错误的内部结构。

    在我阅读的测试代码和我们编写的测试代码中,我们使用以下模式之一:

  • 大多数情况下,我们只是将错误与 nil 进行比较。 ;
  • 在某些情况下,我们的函数返回预定义的错误值,我们测试这些特定值:
  • package pkg

    var ErrUnboltedGizmo = errors.New("gizmo is unbolted")

    // in test functions, depending on the case :
    if err == pkg.ErrUnboltedGizmo { ...
    // or :
    if errors.Is(err, pkg.ErrUnboltedGizmo) { ...
  • 当我们的生产代码要求发现特定错误时(常见用例是 io.EOF ),我们编写代码来尽职尽责地包装该已知错误,并使用 errors.Is() (在生产代码和测试代码中),
  • 当需要仅在测试中,松散地确认错误匹配某些内容而不是其他内容时(例如:Parse error 而不是 File not found),我们只需在错误消息中搜索字符串:
  • if err == nil || !strings.Contains(err.Error(), "database name is not exists") {
    t.Errorf("unexpected error : %s", err)
    }

    关于go - 比较 Go 中的 2 个错误进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67297747/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com