第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

去簡單的 http 處理程序測試所有路徑

去簡單的 http 處理程序測試所有路徑

Go
泛舟湖上清波郎朗 2021-11-08 10:27:41
我試圖在這個簡單的 http 處理程序文件上獲得 100% 的代碼覆蓋率。如果成功,該文件將寫入默認響應(yīng)標頭,然后返回 200 并帶有我在下面測試過的“Pong”。但是,也有可能寫入默認標頭會產(chǎn)生錯誤,在這種情況下,預(yù)計會出現(xiàn)帶有內(nèi)部錯誤正文的 500 響應(yīng)。我正在努力弄清楚如何在測試中觸發(fā) 500 響應(yīng)案例。如果由于某種原因?qū)?writeDefaultHeaders 函數(shù)調(diào)用的第二個參數(shù)更改為“html”,例如因為 html 不是我的服務(wù)中支持的響應(yīng)內(nèi)容類型,則該案例將失敗。在代碼中模擬這個調(diào)用/點擊這個錯誤分支的慣用方法是什么?謝謝。ping_handler_test.gopackage mainimport (    "net/http"    "net/http/httptest"    "testing")func Test200PingHandler(t *testing.T) {    req, _ := http.NewRequest("GET", "/ping", nil)    w := httptest.NewRecorder()    PingHandler(w, req)    if w.Code != http.StatusOK {        t.Errorf("Ping Handler Status Code is NOT 200; got %v", w.Code)    }    if w.Body.String() != "Pong" {        t.Errorf("Ping Handler Response Body is NOT Pong; got %v", w.Body.String())    }}// This fails as it is the same setup as the passing success casefunc Test500PingHandler(t *testing.T) {    req, _ := http.NewRequest("GET", "/ping", nil)    w := httptest.NewRecorder()    PingHandler(w, req)    if w.Code != http.StatusInternalServerError {        t.Errorf("Ping Handler Status Code is NOT 500; got %v", w.Code)    }    if w.Body.String() != "Internal Server Error" {        t.Errorf("Ping Handler Response Body is NOT Internal Server Error; got %v", w.Body.String())    }}func BenchmarkPingHandler(b *testing.B) {    for i := 0; i < b.N; i++ {        req, _ := http.NewRequest("GET", "/ping", nil)        w := httptest.NewRecorder()        PingHandler(w, req)    }}ping_handler.gopackage mainimport (    "fmt"    "net/http")func PingHandler(w http.ResponseWriter, r *http.Request) {    err := writeDefaultHeaders(w, "text")    if err != nil {        handleException(w, err)        return    }    fmt.Fprintf(w, "Pong")}在這種情況下,我如何測試 json.Marshal 返回錯誤?
查看完整描述

3 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

除非我遺漏了一些東西,否則獲取錯誤的方法是刪除硬編碼"text"并將您傳遞的任何內(nèi)容作為contentType請求中的內(nèi)容。將其從請求中解析出來,然后將其傳遞給 writeDefaultHeaders。傳遞 case 是"text"or "json",其他一切都應(yīng)該給你你的錯誤,假設(shè)handleException按預(yù)期工作(你沒有顯示它)


示例(當然您不希望“Content-Type”標題看起來像這樣)


package main


import (

    "net/http"

    "net/http/httptest"

    "testing"

)


func Test200PingHandler(t *testing.T) {

    req, _ := http.NewRequest("GET", "/ping", nil)

    req.Header().Set("Content-Type", "text")

    //req.Header().Set("Content-Type", "json")

    w := httptest.NewRecorder()


    PingHandler(w, req)


    if w.Code != http.StatusOK {

        t.Errorf("Ping Handler Status Code is NOT 200; got %v", w.Code)

    }


    if w.Body.String() != "Pong" {

        t.Errorf("Ping Handler Response Body is NOT Pong; got %v", w.Body.String())

    }

}


// This fails as it is the same setup as the passing success case

func Test500PingHandler(t *testing.T) {

    req, _ := http.NewRequest("GET", "/ping", nil)

    req.Header().Set("Content-Type", "fail")

    w := httptest.NewRecorder()


    PingHandler(w, req)


    if w.Code != http.StatusInternalServerError {

        t.Errorf("Ping Handler Status Code is NOT 500; got %v", w.Code)

    }


    if w.Body.String() != "Internal Server Error" {

        t.Errorf("Ping Handler Response Body is NOT Internal Server Error; got %v", w.Body.String())

    }

}

主要的


package main


import (

    "fmt"

    "net/http"

)


func PingHandler(w http.ResponseWriter, r *http.Request) {

    err := writeDefaultHeaders(w, req.Header().Get("Content-Type"))

    if err != nil {

        handleException(w, err)

        return

    }


    fmt.Fprintf(w, "Pong")

}


func writeDefaultHeaders(w http.ResponseWriter, contentType string) error {

    w.Header().Set("X-Frame-Options", "DENY")

    w.Header().Set("X-Content-Type-Options", "nosniff")

    w.Header().Set("X-XSS-Protection", "1;mode=block")


    switch contentType {

    case "text":

        w.Header().Set("Content-Type", "text/plain; charset=utf-8")

        return nil

    case "json":

        w.Header().Set("Content-Type", "application/json; charset=UTF-8")

        return nil

    default:

        return errors.New("Attempting to render an unknown content type")

    }

}


查看完整回答
反對 回復(fù) 2021-11-08
?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

正如你所寫的,這段代碼永遠不會在 PingHandler 中到達:


if err != nil {

    handleException(w, err)

    return

}

因為你唯一返回錯誤的地方是 writeDefaultHeaders 傳遞的不是文本或 json 的東西,并且在 PingHandler 中你硬編碼“文本”,所以 ping 處理程序永遠不會調(diào)用 handleException,并且錯誤處理是多余的。在 writeDefaultHeaders 中沒有其他地方可能會返回錯誤。


如果您想測試 handleException,要查看它正確返回 500 錯誤(這是您在 Test500PingHandler 中斷言/測試的內(nèi)容),只需在測試文件中構(gòu)造一個 PingHandlerFail 函數(shù),該函數(shù)設(shè)置不正確的 responseType 并使用它 - 沒有其他觸發(fā)錯誤代碼的方法。


func PingHandlerFail(w http.ResponseWriter, r *http.Request) {

    err := writeDefaultHeaders(w, "foo")

    if err != nil {

        handleException(w, err)

        return

    }

    fmt.Fprintf(w, "Pong")

}

或者,更改 PingHandler 以根據(jù)某些請求條件設(shè)置 contentType,例如請求是否以 .json 結(jié)尾(您可能需要這樣做以提供 json 或文本),以便您可以以某種方式觸發(fā)錯誤 - 目前由于 PingHandler 除了文本之外從不提供任何內(nèi)容,因此錯誤代碼是多余的并且結(jié)果無法測試。


查看完整回答
反對 回復(fù) 2021-11-08
?
12345678_0001

TA貢獻1802條經(jīng)驗 獲得超5個贊

在代碼中模擬這個調(diào)用/點擊這個錯誤分支的慣用方法是什么?


通常對于測試,您希望使用公共接口并為您的代碼提供實現(xiàn) ( NewMyThing(hw HeaderWriter)) 或使用其他一些機制(例如DefaultHeaderWriter您可以在測試中換出的機制)。


由于此代碼是私有的,因此您可以只使用一個變量:


var writeDefaultHeaders = func(w http.ResponseWriter, contentType string) error {

    w.Header().Set("X-Frame-Options", "DENY")

    w.Header().Set("X-Content-Type-Options", "nosniff")

    w.Header().Set("X-XSS-Protection", "1;mode=block")


    switch contentType {

    case "text":

        w.Header().Set("Content-Type", "text/plain; charset=utf-8")

        return nil

    case "json":

        w.Header().Set("Content-Type", "application/json; charset=UTF-8")

        return nil

    default:

        return errors.New("Attempting to render an unknown content type")

    }

}


func PingHandler(w http.ResponseWriter, r *http.Request) {

    err := writeDefaultHeaders(w, "text")

    if err != nil {

        handleException(w, err)

        return

    }


    fmt.Fprintf(w, "Pong")

}

然后在你的測試中換掉它:


func Test500PingHandler(t *testing.T) {

    writeDefaultHeaders = headerWriterFunc(func(w http.ResponseWriter, contentType string) error {

        return fmt.Errorf("ERROR")

    })

    // ...

}

您可能想在完成后將其設(shè)置回原處。


在我看來,像這樣換出一個單一的功能并不是好的測試實踐。測試應(yīng)該針對公共 API,這樣您就可以修改代碼,而不必在每次進行更改時都重新編寫測試。


接口示例:


type Marshaler interface {

    Marshal(v interface{}) ([]byte, error)

}


type jsonMarshaler struct{}


func (_ *jsonMarshaler) Marshal(v interface{}) ([]byte, error) {

    return json.Marshal(v)

}


var marshaler Marshaler = (*jsonMarshaler)(nil)

進而:


json_response, err := marshaler.Marshal(response)


查看完整回答
反對 回復(fù) 2021-11-08
  • 3 回答
  • 0 關(guān)注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號