如何模拟ping命令

时间:2019-08-30 08:48:12

标签: database go mocking

我正在使用https://github.com/DATA-DOG/go-sqlmock 并尝试模拟与数据库的连接。

现在,我需要模拟ping命令(出于负载平衡目的)。但是,我找不到有关如何执行此操作的任何信息。

例如,我想编写一个这样的测试

InsertParams

此外,我需要将此模拟对象注入到函数中。假设New(* sql.DB)输出一个新结构。因此它必须与* sql.DB结构兼容。因此,sqlmock似乎是一个不错的选择。但是,我还没有找到模拟ping命令的方法。

有什么办法可以使用这个库吗? 如果没有,是否还有其他数据库/ sql模拟库可以解决问题?

2 个答案:

答案 0 :(得分:3)

不,没有“相似之处”。 PingPingContext方法取决于实现Pinger接口的驱动程序,因此,例如,期望“ SELECT 1”之类的东西,就无法模仿它。

already an issue请求添加它。似乎并没有引起太多关注。我怀疑创建PR(可能大约需要3行代码)会大大增加添加该功能的机会。


如果您的目标是使Ping失败,则应该能够通过连接到无效的数据库端点(使用sqlmock或不使用sqlmock)来模仿它。

答案 1 :(得分:2)

您当然可以嘲笑db本身:

type mockedDB struct {
    *sql.DB
}

func (db *mockedDB) Ping() error {
    return errors.New("not implemented")
}

func Example_mockedDB_Ping() {
    db, _, _ := sqlmock.New()
    defer db.Close()

    mdb := mockedDB{db}
    fmt.Println("mdb.Ping(): ", mdb.Ping())
    // Output: mdb.Ping():  not implemented
}

但我不知道这种实验的目的是什么。

您可以用同样的方式将mock放入新类型并在其上定义ExpectPing