Golang gorm 嘲笑

问题描述 投票:0回答:2

我在我的项目中使用gorm。我可以在没有数据库连接的情况下模拟这个数据库 orm 进行测试吗?问题是我们有 CI 工具,但我没有数据库或没有足够数据进行测试的数据库。另一方面,我不想在每次测试时都设置数据库,因为在这些情况下,CI 工具每次都会创建一个仅用于运行测试的容器。

测试数据库相关方法的最佳方法是什么?我在我的解决方案中使用依赖注入,因此很容易用模拟数据库替换数据库。但是gorm有很多orm相关的功能。

这是一个处理程序,例如:

func tokenIntrospectionHandler(db *gorm.DB) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        defer req.Body.Close()
        token := req.FormValue("token")
        var resp Response
        json.NewEncoder(w).Encode(resp)
    })
}
database testing go mocking go-gorm
2个回答
4
投票

对于单元测试,这看起来非常适合模拟

gorm.DB
https://github.com/DATA-DOG/go-sqlmock

这是他们网站上的示例。您只需创建模拟,然后创建数据库,设置方法调用的期望,然后运行测试代码,最后检查是否满足期望。


// a successful case
func TestShouldUpdateStats(t *testing.T) {
    db, mock, err := sqlmock.New()
    if err != nil {
        t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    }
    defer db.Close()

    mock.ExpectBegin()
    mock.ExpectExec("UPDATE products").WillReturnResult(sqlmock.NewResult(1, 1))
    mock.ExpectExec("INSERT INTO product_viewers").WithArgs(2, 3).WillReturnResult(sqlmock.NewResult(1, 1))
    mock.ExpectCommit()

    // now we execute our method
    if err = recordStats(db, 2, 3); err != nil {
        t.Errorf("error was not expected while updating stats: %s", err)
    }

    // we make sure that all expectations were met
    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expectations: %s", err)
    }
}

-1
投票

如果您使用干净的架构,只需模拟您的存储库就好多了

© www.soinside.com 2019 - 2024. All rights reserved.