首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >渲染后返回语句的Golang lint

渲染后返回语句的Golang lint
EN

Stack Overflow用户
提问于 2018-12-17 11:22:38
回答 1查看 86关注 0票数 0

如果您不在render语句之后编写return,您将向客户端返回多个HTTP状态。我真的很想避免这种情况,因为它既可能有安全隐患,也可能只是……奇怪的行为。

示例:

代码语言:javascript
复制
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

有没有林特可以警告你这一点,以避免愚蠢的错误?

EN

回答 1

Stack Overflow用户

发布于 2018-12-18 05:04:43

我认为这是一个很好的单元测试案例。如果出现您所描述的情况,mock将会很高兴地失败:

代码语言:javascript
复制
// 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
}

现在测试..。

代码语言:javascript
复制
// 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不是一个包。那么一些调整将是必要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53808582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档