0

我正在尝试测试我的UserRegister功能,它需要http请求。

如果用户输入已经存在的电子邮件,UserRegister则返回错误日志(使用logrus)。

logs "github.com/sirupsen/logrus"

func UserRegister(res http.ResponseWriter, req *http.Request) {

    requestID := req.FormValue("uid")
    email := req.FormValue("email")

    logs.WithFields(logs.Fields{
        "Service":  "User Service",
        "package":  "register",
        "function": "UserRegister",
        "uuid":     requestID,
        "email":    email,
    }).Info("Received data to insert to users table")

    // check user entered new email address
    hasAccount := checkemail.Checkmail(email, requestID) // returns true/false

    if hasAccount != true { // User doesn't have an account

        db := dbConn()

        // Inserting token to login_token table
        insertUser, err := db.Prepare("INSERT INTO users (email) VALUES(?)")
        if err != nil {
            logs.WithFields(logs.Fields{
                "Service":  "User Service",
                "package":  "register",
                "function": "UserRegister",
                "uuid":     requestID,
                "Error":    err,
            }).Error("Couldnt prepare insert statement for users table")
        }
        insertUser.Exec(email)
        defer db.Close()
        return
    } // user account created

    logs.WithFields(logs.Fields{
        "Service":  "User Service",
        "package":  "register",
        "function": "UserRegister",
        "uuid":     requestID,
        "email":    email,
    }).Error("User has an account for this email")


}

在我的测试模块中,我使用了以下内容。

func TestUserRegister(t *testing.T) {
    rec := httptest.NewRecorder()
    req, _ := http.NewRequest("POST", "http://localhost:7071/register?email=sachit45345h@gmail.com&uid=sjfkjsdkf9w89w83490w", nil)

    UserRegister(rec, req)

    expected := "User has an account for this email"

    res := rec.Result()
    content, err := ioutil.ReadAll(res.Body)

    if err != nil {
        t.Error("Couldnt read body", err)
    }

    val, err := strconv.Atoi(string(bytes.TrimSpace(content)))

    if err != nil {
        log.Println("Error parsing response", err)
    }
    if string(val) != expected { 
        t.Errorf("Expected %s, got %s", expected, string(content))
    }

}

结果:解析响应 strconv.Atoi 时出错:解析“”:语法无效

为什么响应不能转换?

检查线程:

为什么这个将字符串转换为整数的 Golang 代码失败了。

编辑:在@chmike回答之后。

这是微服务的一部分。所有响应都写入API-Gateway. 使用一个函数。

但在这里我只想执行单元测试并检查我的UserRegister工作是否符合预期。

4

2 回答 2

2

您正在阅读的 http 响应不是对您的请求的响应。您创建一个响应并期望它包含一些内容。它不会。所以你最终试图从一个空字符串创建一个整数。

看一些例子,看看真正的反应来自哪里。https://golang.org/pkg/net/http

于 2020-01-09T04:29:45.653 回答
2

该函数UserRegister从不写入res或设置状态。结果,您从resin得到一个空字符串TestUserRegistercontent是一个空字符串,空字符串到整数的转换Atoi失败,因为没有整数要转换。

我只能解释发生了什么。我不能告诉你该怎么做才能解决这个问题,因为你没有解释你想做什么或在问题中得到什么。

于 2020-01-09T07:57:06.503 回答