如何在go中测试数据库错误?

How to test db errors in go?

我正在实施一个由 leveldb (https://github.com/syndtr/goleveldb) 支持的存储程序。我是新来的,我想弄清楚我如何获得下面代码中 perr != nil 条件的测试覆盖率。我可以测试自己的错误,但我无法弄清楚如何可靠地将 leveldb 的 Put 方法设置为 return 错误。 模拟一个数据库只是为了获得一些边缘案例的测试覆盖率,这似乎是一项没有多少回报的大量工作。嘲笑 leveldb 是我唯一真正的选择吗?如果是的话,推荐的 go 模拟框架是什么?如果还有别的方法是什么?

    if err == leveldb.ErrNotFound {
            store.Lock()
            perr := store.ldb.Put(itob(p.ID), p.ToBytes(), nil)
            if perr != nil {
                    store.Unlock()
                    return &StorerError{
                            Message: fmt.Sprintf("leveldb put error could not create puppy %d : %s", p.ID, perr),
                            Code:    501,
                    }
            }
            store.Unlock()
            return nil
    }

模拟是此类测试的一般选择方法,这就是为什么 golang/mock,例如,有一个 mockgen 命令,以 生成测试代码。

mockgen has two modes of operation: source and reflect.

  • Source mode generates mock interfaces from a source file.
    It is enabled by using the -source flag.
    Other flags that may be useful in this mode are -imports and -aux_files.

Example:

mockgen -source=foo.go [other options]
  • Reflect mode generates mock interfaces by building a program that uses reflection to understand interfaces.
    It is enabled by passing two non-flag arguments: an import path, and a comma-separated list of symbols.

Example:

mockgen database/sql/driver Conn,Driver