如果您不在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.WriteHeader(http.StatusOK)
render.JSON(w, r, nil)
return
有没有林特可以警告你这一点,以避免愚蠢的错误?
发布于 2018-12-18 05:04:43
我认为这是一个很好的单元测试案例。如果出现您所描述的情况,mock将会很高兴地失败:
// 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
不是一个包。那么一些调整将是必要的。
https://stackoverflow.com/questions/53808582
复制相似问题