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

时间:2019-07-06 06:03:11

标签: unit-testing go mocking leveldb

我正在实施一个由leveldb(https://github.com/syndtr/goleveldb)支持的存储器。我是新手,正尝试找出如何在下面的代码中获得条件的测试覆盖率,其中perr!= nil。我可以测试自己的错误,但是我无法弄清楚如何可靠地获取leveldb的Put方法以返回错误。 模拟数据库只是为了在少数情况下提高测试覆盖率,这似乎是很多工作,但却没有太多回报。在这里嘲笑leveldb是我唯一的真实选择吗?如果是这样,建议使用什么模拟框架?如果还有另一种方式,那是什么?

    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
    }

1 个答案:

答案 0 :(得分:1)

模拟是此类测试的常用方法,因此golang/mock例如具有 mockgen 命令以生成的原因em>测试代码。

  

mockgen具有两种操作模式:源和反射。

     
      
  • 模式从源文件生成模拟接口。
      通过使用-source标志启用它。
      在此模式下可能有用的其他标志是-imports-aux_files
  •   
     

示例:

mockgen -source=foo.go [other options]
     
      
  • 反映模式通过构建程序来生成模拟界面   使用反射来了解界面。
      可以通过传递两个非标记参数来启用它:导入路径和   逗号分隔的符号列表。
  •   
     

示例:

mockgen database/sql/driver Conn,Driver