【问题标题】:Golang lint for return statement after render渲染后返回语句的 Golang lint
【发布时间】:2018-12-17 03:22:38
【问题描述】:

如果您在渲染语句后不写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

是否有任何 linter 可以警告您这一点,以避免愚蠢的错误?

【问题讨论】:

  • afaik 没有 linting 选项。涵盖用例的适当测试应该会有所帮助

标签: go


【解决方案1】:

我认为这对于单元测试来说是一个不错的案例。一个模拟会很高兴像你描述的那样失败:

// 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 不是一个包。那么就需要进行一些调整。

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2015-08-05
    • 2020-12-09
    • 1970-01-01
    • 2018-05-07
    • 2019-12-10
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多