gpt4 book ai didi

unit-testing - 在golang中重新定义const进行测试

转载 作者:IT王子 更新时间:2023-10-29 01:25:57 25 4
gpt4 key购买 nike

我正在为服务和测试编写一个 http 客户端,我想使用 net/http/httptest 服务器而不是调用远程 API。如果我将 baseUrl 设置为我的测试服务器的 url 的全局变量,我可以轻松地做到这一点。但是,这会使生产代码更加脆弱,因为 baseUrl 也可以在运行时更改。我的偏好是使 baseUrl 成为生产代码的 const 但仍然可以更改。

package main
const baseUrl = "http://google.com"

// in main_test.go
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
...
}
const baseUrl = ts.URL
// above line throws const baseUrl already defined error

最佳答案

如果您的代码使用 const 值,则它测试不友好(关于使用该参数的不同值进行测试)。

您可以通过轻微的重构来解决您的问题。假设您有一个使用此常量的函数:

const baseUrl = "http://google.com"

func MyFunc() string {
// use baseUrl
}

您可以创建另一个将基本 URL 作为参数的函数,您的原始 MyFunc() 调用它:

const baseUrl_ = "http://google.com"

func MyFunc() string {
// Call other function passing the const value
return myFuncImpl(baseUrl_)
}

func myFuncImpl(baseUrl string) string {
// use baseUrl
// Same implementation that was in your original MyFunc() function
}

这样你的库的 API 就不会改变,但是现在你可以通过测试 myFuncImpl() 来测试你原来的 MyFunc() 的功能,并且你可以传递任何值进行测试。

调用 MyFunc() 将保持安全,因为它始终将 const baseUrl_ 传递给实现所在的 myFuncImpl()。是否导出这个新的 myFuncImpl() 函数由您决定;它可能保持未导出状态,因为测试代码可能(应该)放在同一个包中并且可以毫无问题地调用它。

关于unit-testing - 在golang中重新定义const进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com