Я думаю, что это достойный случай для юнит-тестов.Ложь с радостью провалилась бы с тем, что вы описали:
// 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
не является пакетом.Тогда понадобятся некоторые корректировки.