当前位置: 首页 > 面试题库 >

在Golang中测试HTTP路由

卜季萌
2023-03-14
问题内容

我正在使用Gorilla mux和net / http包来创建一些路由,如下所示

package routes

//some imports

//some stuff

func AddQuestionRoutes(r *mux.Router) {
    s := r.PathPrefix("/questions").Subrouter()
    s.HandleFunc("/{question_id}/{question_type}", getQuestion).Methods("GET")
    s.HandleFunc("/", postQuestion).Methods("POST")
    s.HandleFunc("/", putQuestion).Methods("PUT")
    s.HandleFunc("/{question_id}", deleteQuestion).Methods("DELETE")
}

我正在尝试编写测试以测试这些路线。例如,我正在尝试测试GET路由,特别是试图400返回的路由,因此我有以下测试代码。

package routes

//some imports

var m *mux.Router
var req *http.Request
var err error
var respRec *httptest.ResponseRecorder

func init() {
    //mux router with added question routes
    m = mux.NewRouter()
    AddQuestionRoutes(m)

    //The response recorder used to record HTTP responses
    respRec = httptest.NewRecorder()
}

func TestGet400(t *testing.T) {
    //Testing get of non existent question type
    req, err = http.NewRequest("GET", "/questions/1/SC", nil)
    if err != nil {
        t.Fatal("Creating 'GET /questions/1/SC' request failed!")
    }

    m.ServeHTTP(respRec, req)

    if respRec.Code != http.StatusBadRequest {
        t.Fatal("Server error: Returned ", respRec.Code, " instead of ", http.StatusBadRequest)
    }
}

但是,当我运行此测试时,404可以想象得到是因为请求未正确路由。

当我从浏览器测试此GET路由时,它确实返回,400因此我确定测试的设置方式存在问题。


问题答案:

在这里使用init()是可疑的。它仅在程序初始化过程中执行一次。相反,也许像这样:

func setup() {
    //mux router with added question routes
    m = mux.NewRouter()
    AddQuestionRoutes(m)

    //The response recorder used to record HTTP responses
    respRec = httptest.NewRecorder()
}

func TestGet400(t *testing.T) {
    setup()
    //Testing get of non existent question type
    req, err = http.NewRequest("GET", "/questions/1/SC", nil)
    if err != nil {
        t.Fatal("Creating 'GET /questions/1/SC' request failed!")
    }

    m.ServeHTTP(respRec, req)

    if respRec.Code != http.StatusBadRequest {
        t.Fatal("Server error: Returned ", respRec.Code, " instead of ", http.StatusBadRequest)
    }
}

您可以在每个适当的测试用例的开头调用setup()。您的原始代码与其他测试共享相同的respRec,这可能会污染您的测试结果。

如果您需要一个提供更多功能的测试框架,例如设置/拆卸夹具,请参阅gocheck之类的软件包。



 类似资料:
  • 问题内容: 最近,我希望为golang编写单元测试。功能如下。 那么,如何测试“ func Display”的结果是“ hello world”呢? 问题答案: 您只需输入自己的值,然后测试写入其中的内容是否符合您的期望。这样做是一个不错的选择,因为它只是将输出存储在其缓冲区中。

  • 本文向大家介绍golang分层测试之http接口测试入门教程,包括了golang分层测试之http接口测试入门教程的使用技巧和注意事项,需要的朋友参考一下 前言 前几话主要讲解关于使用golang进行单元测试,在单元测试的上一层就是接口测试,本节主要讲使用golang进行接口测试,其中主要以http协议的接口测试来讲解 golang中的http请求 golang中拥有一个原生的http依赖库:ne

  • 问题内容: 我使用了getests和gorilla mux,并且可以对我的http handlefunc处理程序进行单元测试,但是它们没有像在大猩猩mux下那样响应正确的http请求方法。如何进行“实时服务器”版本的测试? 这里的问题是该函数同时响应get和post请求,而没有考虑我的主路由器。这对于单元测试功能是很好的,但是我认为最好编写一个集成测试来测试整个事情并一次性解决所有问题。 问题答案

  • 英文原文:http://emberjs.com/guides/testing/testing-routes/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Route集成自Ember.Object。 路由测试可以通过集成测试或者单元测试来进行。集成测试对路由的测试具有更好地覆盖性,因为路由通常用来执行过渡和数据加载,这些测试在完整上下文中更加容易测试,而独立上下文则没有那么

  • 简介 Laravel 为 HTTP 请求的生成和输出的检查都提供了非常流畅的 API。例如,你可以查看下面的这个测试用例: <?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\

  • 用mocha测试一个async函数是非常方便的。现在,当我们有了一个koa的Web应用程序时,我们怎么用mocha来自动化测试Web应用程序呢? 一个简单的想法就是在测试前启动koa的app,然后运行async测试,在测试代码中发送http请求,收到响应后检查结果,这样,一个基于http接口的测试就可以自动运行。 我们先创建一个最简单的koa应用,结构如下: koa-test/ | +- .vsc