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

我正在为服务和测试编写一个 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


不负相思意
浏览 173回答 1
1回答

慕娘9325324

如果您的代码使用 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 不会改变,但现在你可以MyFunc()通过 testing 来测试你原来的功能myFuncImpl(),你可以传递任何值来测试。调用MyFunc()将保持安全,因为它总是将 const 传递baseUrl_到myFuncImpl()实现现在所在的位置。是否myFuncImpl()导出此新函数由您决定;它可能保持未导出状态,因为测试代码可能(应该)放在同一个包中并且可以毫无问题地调用它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go