Golang lint для возврата после рендера - PullRequest
0 голосов
/ 17 декабря 2018

Если вы не напишите return после оператора рендеринга, вы отправите несколько HTTP-статусов обратно клиенту.Я действительно хотел бы избежать этого, поскольку это может иметь как последствия для безопасности, так и просто ... странное поведение.

Пример:

if passwordNotCorrect {
    w.WriteHeader(http.StatusUnauthorized)
    render.JSON(w, r, nil)
    return // If this is missing, we will return both 401 and 200.
}

w.WriteHeader(http.StatusOK)
render.JSON(w, r, nil)
return

Есть ли какой-нибудь мусор, который мог быпредупредить вас об этом, чтобы избежать глупых ошибок?

1 Ответ

0 голосов
/ 18 декабря 2018

Я думаю, что это достойный случай для юнит-тестов.Ложь с радостью провалилась бы с тем, что вы описали:

// foo.go

package foo

type Foo struct{
  render Renderer
}

func New(r Renderer) *Foo {
  return &Foo{render: r}
}

func (f *Foo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  if passwordNotCorrect {
    w.WriteHeader(http.StatusUnauthorized)
    render.JSON(w, r, nil)
    return // If this is missing, we will return both 401 and 200.
  }

  w.WriteHeader(http.StatusOK)
  render.JSON(w, r, nil)
  return
}

Теперь для теста ...

// foo_test.go

package foo_test

import (
  "github.com/something/whatever/foo"
  "github.com/golang/mock/gomock"
)

//go:generate mockgen --source=foo.go --destination=mock_test.go --package=foo_test

func TestFoo(t *testing.T) {
  ctrl := gomock.NewController(t)
  defer ctrl.Finish()

  mockRenderer := NewMockRenderer(ctrl)
  mockRenderer.
    EXPECT().
    JSON(gomock.Any(), gomock.Any(), gomock.Any()) // This will fail JSON is invoked twice

  f := foo.New(mockRenderer)
  req := httptest.NewRequest(http.MethodGet, "http://some.url", nil)
  f.ServeHTTP(httptest.NewRecorder(), req)
}

Это предполагает, что render не является пакетом.Тогда понадобятся некоторые корректировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...