Go 如何在使用gin框架进行模拟时将json数据作为请求参数传递
我有一个功能,以创建用户,这是正常工作。现在我必须在Go 如何在使用gin框架进行模拟时将json数据作为请求参数传递,go,mocking,go-gin,testify,Go,Mocking,Go Gin,Testify,我有一个功能,以创建用户,这是正常工作。现在我必须在CreateUser中模拟Prepare和SaveUser函数。但是,CreateUser需要json数据作为请求参数。 下面是我的CreateUser函数 func (server *Server) CreateUser(c *gin.Context) { errList = map[string]string{} user := models.User{} if err := c.ShouldBindJSON(&am
CreateUser
中模拟Prepare和SaveUser
函数。但是,CreateUser
需要json数据作为请求参数。
下面是我的CreateUser
函数
func (server *Server) CreateUser(c *gin.Context) {
errList = map[string]string{}
user := models.User{}
if err := c.ShouldBindJSON(&user); err != nil {
log.Println(err)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) **//every time return from here with error -> invalid request**
return
}
user.Prepare()
userCreated, err := sqlstore.SaveUser(&user)
if err != nil {
formattedError := formaterror.FormatError(err.Error())
errList = formattedError
c.JSON(http.StatusInternalServerError, gin.H{
"status": http.StatusInternalServerError,
"error": errList,
})
return
}
c.JSON(http.StatusCreated, gin.H{
"status": http.StatusCreated,
"response": userCreated,
})
}
这是作为上述创建用户的请求参数所必需的json数据。我想在模拟时传递以下数据
{"firstname":"test","email":"test@test.com"}
下面是模拟上面创建用户函数的测试用例
type UserMock struct {
mock.Mock
}
func (u *UserMock) Prepare() (string, error) {
args := u.Called()
return args.String(0), args.Error(1)
}
func (u *UserMock) SaveUser() (string, error) {
args := u.Called()
return args.String(0), args.Error(1)
}
func TestCreateUser(t *testing.T) {
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
**//how to json data as request parameter**
uMock := UserMock{}
uMock.On("Prepare").Return("mocktest", nil)
server := Server{}
server.CreateUser(c)
if w.Code != 201 {
t.Error("Unexpected status code found : ",w.Code)
}
}
提前感谢。您需要在新请求中添加strings.NewReader(string(myjson))。请检查此项,并将其作为当前GIN代码的模板
// TestCreateUser new test
func TestCreateUser(t *testing.T) {
// Setup Recorder, TestContext, Router
router := getRouter(true)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
// set JSON body
jsonParam := `{"firstname":"test","email":"test@test.com"}`
// Mock HTTP Request and it's return
req, err := http.NewRequest("POST", "/user", strings.NewReader(string(jsonParam)))
// make sure request was executed
assert.NoError(t, err)
// Serve Request and recorded data
router.ServeHTTP(w, req)
// Test results
assert.Equal(t, 200, w.Code)
assert.Equal(t, nil, w.Body.String())
// check your response since nil isn't valid return
}
你的问题是什么?@Adrian我如何将json数据作为请求参数传递。就像我想设置
{“firstname”:“test”,“email”:test@test.com“}
gin-context(c),因此当我运行测试用例c.ShouldBindJSON()
时,这不会给我一个错误。这是使用mux路由器完成的。我们可以改用gin路由器吗。@我提到的AmitUpa是一个模板,请检查http.NewRequest()以模拟请求。并沿着数据传递JSON。我会试着喝杜松子酒。今天晚些时候。虽然你会理解这个想法……:)不用担心。@AmitUpa你能不能再检查一下答案,它已经更新了。嘿@Eddwin,谢谢你的回答,我检查了你的答案它正在工作,但我不能模仿Prepare()和SaveUser()
@AmitUpa,因为你正在做端到端测试。您需要模拟您的用户实体,并将其与路由器处理程序一起传递给请求;这意味着必须传递http方法、参数和预期返回。您在这里使用的是什么编码模式?因为我看到您正在呈现的结构上有一些空白,比如server{}struct和userMock不包含任何内容。