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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

我應(yīng)該如何使用 gorilla 上下文對(duì)中間件包進(jìn)行單元測(cè)試

我應(yīng)該如何使用 gorilla 上下文對(duì)中間件包進(jìn)行單元測(cè)試

Go
函數(shù)式編程 2022-01-10 14:51:46
我有這個(gè) net/http 服務(wù)器設(shè)置,鏈中有幾個(gè)中間件,我找不到關(guān)于如何測(cè)試這些的示例......我在 gorilla/mux 路由器上使用基本的 net/http,一個(gè) Handle 看起來(lái)有點(diǎn)像這樣:r.Handle("/documents", addCors(checkAPIKey(getDocuments(sendJSON)))).Methods("GET")在這些中,我匯總了一些數(shù)據(jù)并通過(guò) Gorilla Context context.Set 方法提供它們。通常我用httptest測(cè)試我的http函數(shù),我也希望用這些來(lái)做,但我不知道怎么做,我很好奇什么是最好的方法。我應(yīng)該單獨(dú)測(cè)試每個(gè)中間件嗎?我應(yīng)該在需要時(shí)預(yù)先填充適當(dāng)?shù)纳舷挛闹祮幔课铱梢砸淮螠y(cè)試整個(gè)鏈,以便我可以檢查輸入的所需狀態(tài)嗎?
查看完整描述

1 回答

?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊

我不會(huì)測(cè)試任何涉及 Gorilla 或任何其他 3rd 方包的東西。如果您想測(cè)試以確保它正常工作,我會(huì)為您的應(yīng)用程序運(yùn)行版本(例如 CI 服務(wù)器)的端點(diǎn)設(shè)置一些外部測(cè)試運(yùn)行程序或集成套件。


相反,單獨(dú)測(cè)試您的中間件和處理程序 - 就像您可以控制的那樣。


但是,如果您準(zhǔn)備測(cè)試堆棧(mux -> 處理程序 -> 處理程序 -> 處理程序 -> MyHandler),那么使用函數(shù)作為變量全局定義中間件可能會(huì)有所幫助:


var addCors = func(h http.Handler) http.Handler {

  ...

}


var checkAPIKey = func(h http.Handler) http.Handler {

  ...

}

在正常使用期間,它們的實(shí)現(xiàn)保持不變。


r.Handle("/documents", addCors(checkAPIKey(getDocuments(sendJSON)))).Methods("GET")

但是對(duì)于單元測(cè)試,您可以覆蓋它們:


// important to keep the same package name for

// your test file, so you can get to the private

// vars.

package main


import (

  "testing"

)


func TestXYZHandler(t *testing.T) {


  // save the state, so you can restore at the end

  addCorsBefore := addCors

  checkAPIKeyBefore := checkAPIKey


  // override with whatever customization you want

  addCors = func(h http.Handler) http.Handler {

    return h

  }

  checkAPIKey = func(h http.Handler) http.Handler {

    return h

  }


  // arrange, test, assert, etc.

  //


  // when done, be a good dev and restore the global state

  addCors = addCorsBefore

  checkAPIKey = checkAPIKeyBefore

}

如果您發(fā)現(xiàn)自己經(jīng)常復(fù)制粘貼此樣板代碼,請(qǐng)將其移至單元測(cè)試中的全局模式:


package main


import (

  "testing"

)


var (

  addCorsBefore = addCors

  checkAPIKeyBefore = checkAPIKey

)


func clearMiddleware() {

  addCors = func(h http.Handler) http.Handler {

    return h

  }

  checkAPIKey = func(h http.Handler) http.Handler {

    return h

  }

}


func restoreMiddleware() {

  addCors = addCorsBefore

  checkAPIKey = checkAPIKeyBefore

}


func TestXYZHandler(t *testing.T) {


  clearMiddleware()


  // arrange, test, assert, etc.

  //


  restoreMiddleware()

}

關(guān)于單元測(cè)試端點(diǎn)的旁注......


由于中間件應(yīng)該以合理的默認(rèn)值運(yùn)行(預(yù)計(jì)正常傳遞,而不是您要在 func 中測(cè)試的底層數(shù)據(jù)流的互斥狀態(tài)),我建議在實(shí)際主 Handler 函數(shù)的上下文之外對(duì)中間件進(jìn)行單元測(cè)試。


這樣,您就有了一組嚴(yán)格針對(duì)中間件的單元測(cè)試。另一組測(cè)試完全專注于您正在調(diào)用的 url 的主要處理程序。它使新手更容易發(fā)現(xiàn)代碼。


查看完整回答
反對(duì) 回復(fù) 2022-01-10
  • 1 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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