2015-11-18 2 views
3

Я пишу http-клиент для службы и для тестирования. Я хочу использовать сервер net/http/httptest вместо вызова удаленного API. Я могу легко сделать это, если я сделаю baseUrl глобальной переменной, которая будет установлена ​​на URL-адрес моего тестового сервера. Однако это делает производственный код более хрупким, потому что baseUrl также может быть изменен во время выполнения. Мое предпочтение было бы сделать baseUrl a const для производственного кода, но все же быть в состоянии изменить.Redefine const in golang для теста

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 

ответ

4

Если ваш код использует константное значение, не тестирования дружественного (относительно тестирования с различными значениями этого параметра).

Вы можете подойти к своей проблеме с небольшим рефакторингом. Скажем, у вас есть функция, которая использует это ПОСТОЯННЫЙ:

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(), проверив myFuncImpl(), и вы можете передать любое значение для тестирования.

Вызов MyFunc() будет оставаться в безопасности, поскольку он всегда передает константу baseUrl_ в myFuncImpl(), где реализована реализация. Это ваше решение о том, экспортируете ли вы эту новую функцию myFuncImpl() или нет; он может оставаться неэкспортированным, так как тестовый код может (должен) быть помещен в один и тот же пакет и может вызвать его без проблем.

+0

Спасибо за ответ, я закончил тем, что сбросил константу, добавив глобальный 'var testServer * httptest.Server' и строку func getURL(), которая проверяет, нет ли testServer. Логическое бытие, менее вероятный производственный код установит testServer, а затем случайно изменит глобальную строку var – Krut