如何在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
我正在实施一个由 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