Я пытаюсь получить покрытие 100% кода в этом простом файле обработчика http.Простой HTTP-обработчик, проверяющий все пути
Файл записывает заголовки ответа по умолчанию в случае успеха и затем возвращает 200 с помощью «Понга», который я тестировал ниже. Тем не менее, существует также вероятность того, что запись заголовков по умолчанию приведет к возникновению ошибки, и в этом случае ожидается ответ 500 с корпусом внутренней ошибки.
Я изо всех сил пытаюсь выяснить, как вызвать ответный ответ 500 в тесте. Случай потерпит неудачу, если по какой-либо причине второй параметр функции writeDefaultHeaders был изменен на «html», например, поскольку html не поддерживает тип содержимого ответа в моей службе.
Что такое идиоматический способ издеваться над этим вызовом/удалять эту ветвь ошибки в коде?
Спасибо.
ping_handler_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func Test200PingHandler(t *testing.T) {
req, _ := http.NewRequest("GET", "/ping", nil)
w := httptest.NewRecorder()
PingHandler(w, req)
if w.Code != http.StatusOK {
t.Errorf("Ping Handler Status Code is NOT 200; got %v", w.Code)
}
if w.Body.String() != "Pong" {
t.Errorf("Ping Handler Response Body is NOT Pong; got %v", w.Body.String())
}
}
// This fails as it is the same setup as the passing success case
func Test500PingHandler(t *testing.T) {
req, _ := http.NewRequest("GET", "/ping", nil)
w := httptest.NewRecorder()
PingHandler(w, req)
if w.Code != http.StatusInternalServerError {
t.Errorf("Ping Handler Status Code is NOT 500; got %v", w.Code)
}
if w.Body.String() != "Internal Server Error" {
t.Errorf("Ping Handler Response Body is NOT Internal Server Error; got %v", w.Body.String())
}
}
func BenchmarkPingHandler(b *testing.B) {
for i := 0; i < b.N; i++ {
req, _ := http.NewRequest("GET", "/ping", nil)
w := httptest.NewRecorder()
PingHandler(w, req)
}
}
ping_handler.go
package main
import (
"fmt"
"net/http"
)
func PingHandler(w http.ResponseWriter, r *http.Request) {
err := writeDefaultHeaders(w, "text")
if err != nil {
handleException(w, err)
return
}
fmt.Fprintf(w, "Pong")
}
func writeDefaultHeaders(w http.ResponseWriter, contentType string) error {
w.Header().Set("X-Frame-Options", "DENY")
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("X-XSS-Protection", "1;mode=block")
switch contentType {
case "text":
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
return nil
case "json":
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
return nil
default:
return errors.New("Attempting to render an unknown content type")
}
}
Редактировать Другой пример:
json_response, err := json.Marshal(response)
if err != nil {
handleException(w, err)
return
}
В этом случае, как я могу проверить json.Marshal, возвращающий ошибку?
Пробовали ли вы просто с помощью 'PingHandler (ноль, ноль)'? Это должно вызвать ошибку, которую я предполагаю? У меня нет всего вашего кода, поэтому я не могу его запустить и проверить – user3591723
Можете ли вы добавить содержимое 'writeDefaultHeaders'? Прямой (проверяемый) подход заключается в том, чтобы написать собственный тип, который включает 'http.ResponseWriter' и просто переопределяет метод (ы), который вы хотите протестировать. – elithrar
@elithrar Добавил его в вопрос. – John