如果您不在渲染语句后编写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
不是一个包。然后需要进行一些调整。
关于渲染后返回语句的 Golang lint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808582/