Как я могу гарантировать, что запрос был выполнен правильно при издевательстве над API?

# #go #testing

Вопрос:

Допустим, я тестирую функцию, которая вызывает веб-службу, и над этой службой издеваются httptest.NewServer

 func TestSomeFeature(t *testing.T) {  server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  w.WriteHeader(200)  }))   SomeFeature(server.URL, "foo") }  func SomeFeature(host, a string) {  if a == "foo" {  http.Get(fmt.Sprintf("%v/foo", host))  }  if a == "bar" {  http.Get(fmt.Sprintf("%v/bar", host))  } }  

Как я могу утверждать, что сервер был вызван с правильным URL /foo -адресом, и провалить тест, если он был вызван с неправильным URL-адресом или вообще не вызывался?

Ответ №1:

Ты можешь сделать это вот так:

 func TestSomeFeature(t *testing.T) {  called := false  server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  // assert that strings.Contains(r.RequestURI, "/foo") is true  called = true  w.WriteHeader(200)  }))   SomeFeature(server.URL, "foo")  // assert that called is true }  

Комментарии:

1. Нет ли проблем с параллелизмом, если я запускаю несколько из них параллельно с одним и тем же server ?

2. @TimoHuovinen конечно, приведенный выше код предназначен для последовательного тестирования, вы не указали параллелизм в своем вопросе