渲染后返回语句的Golang lint
如果在render语句之后不编写渲染后返回语句的Golang lint,go,Go,如果在render语句之后不编写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.Wri
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可以警告您这一点?我认为这对于单元测试来说是一个不错的例子。一个模拟会很高兴地失败,就像你描述的:
// 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
不是一个包。然后需要进行一些调整。afaik没有绒线选项。覆盖用例的适当测试应该会有所帮助