如果您未在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
为了避免愚蠢的错误,有没有可以警告您的短绒呢?
答案 0 :(得分: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
不是包。然后需要进行一些调整。