我正在try 在我的注册处理程序和对数据库的调用上实现单元测试.然而,它在我的注册处理程序中的数据库调用中抛出了死机错误.它是一个简单的注册处理程序,可以接收带有用户名、密码和邮箱的JSON.然后,我将使用SELECT语句判断该用户名在注册处理程序本身中是否重复.
当我向这个处理程序发送我的POST请求时,这一切都起作用.然而,当我实际进行单元测试时,它不起作用,并向我抛出2条错误消息.我认为这是因为数据库没有在测试环境中初始化,但我不确定如何在不使用第三方框架进行模拟数据库的情况下做到这一点.
error message个
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
signup.go个
package handler
type SignUpJson struct {
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
}
func SignUp(w http.ResponseWriter, r *http.Request) {
// Set Headers
w.Header().Set("Content-Type", "application/json")
var newUser auth_management.SignUpJson
// Reading the request body and UnMarshal the body to the LoginJson struct
bs, _ := io.ReadAll(req.Body)
if err := json.Unmarshal(bs, &newUser); err != nil {
utils.ResponseJson(w, http.StatusInternalServerError, "Internal Server Error")
log.Println("Internal Server Error in UnMarshal JSON body in SignUp route:", err)
return
}
ctx := context.Background()
ctx, cancel = context.WithTimeout(ctx, time.Minute * 2)
defer cancel()
// Check if username already exists in database (duplicates not allowed)
isExistingUsername := database.GetUsername(ctx, newUser.Username) // throws panic error here when testing
if isExistingUsername {
utils.ResponseJson(w, http.StatusBadRequest, "Username has already been taken. Please try again.")
return
}
// other code logic...
}
sqlquery.go个
package database
var SQL_SELECT_FROM_USERS = "SELECT %s FROM users WHERE %s = $1;"
func GetUsername(ctx context.Context, username string) bool {
row := conn.QueryRow(ctx, fmt.Sprintf(SQL_SELECT_FROM_USERS, "username", "username"), username)
return row.Scan() != pgx.ErrNoRows
}
SignUp_test.go个
package handler
func Test_SignUp(t *testing.T) {
var tests = []struct {
name string
postedData SignUpJson
expectedStatusCode int
}{
{
name: "valid login",
postedData: SignUpJson{
Username: "testusername",
Password: "testpassword",
Email: "test@email.com",
},
expectedStatusCode: 200,
},
}
for _, e := range tests {
jsonStr, err := json.Marshal(e.postedData)
if err != nil {
t.Fatal(err)
}
// Setting a request for testing
req, _ := http.NewRequest(http.MethodPost, "/signup", strings.NewReader(string(jsonStr)))
req.Header.Set("Content-Type", "application/json")
// Setting and recording the response
res := httptest.NewRecorder()
handler := http.HandlerFunc(SignUp)
handler.ServeHTTP(res, req)
if res.Code != e.expectedStatusCode {
t.Errorf("%s: returned wrong status code; expected %d but got %d", e.name, e.expectedStatusCode, res.Code)
}
}
}
setup_test.go个
func TestMain(m *testing.M) {
os.Exit(m.Run())
}
我在这里看到了类似的问题,但不确定这是不是正确的方法,因为没有回应,答案令人困惑:How to write an unit test for a handler that invokes a function that interacts with db in Golang using pgx driver?