亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) 後端開發(fā) Golang 如何在 Golang 中使用依賴注入進(jìn)行單元測(cè)試?

如何在 Golang 中使用依賴注入進(jìn)行單元測(cè)試?

Jun 02, 2024 pm 08:41 PM
單元測(cè)試 依賴注入

在 Golang 單元測(cè)試中使用依賴注入(DI)可以隔離要測(cè)試的程式碼,簡(jiǎn)化測(cè)試設(shè)定和維護(hù)。流行的 DI 庫(kù)包括 wire 和 go-inject,它們可以產(chǎn)生依賴項(xiàng)樁或模擬,供測(cè)試使用。 DI 測(cè)試的步驟包括設(shè)定依賴項(xiàng)、設(shè)定測(cè)試案例和斷言結(jié)果。使用 DI 測(cè)試 HTTP 請(qǐng)求處理函數(shù)的範(fàn)例表明,它可以輕鬆隔離和測(cè)試程式碼,無需實(shí)際依賴項(xiàng)或通訊。

如何在 Golang 中使用依賴注入進(jìn)行單元測(cè)試?

如何在Golang 中使用依賴注入進(jìn)行單元測(cè)試

##依賴注入(DI)是一種設(shè)計(jì)模式,它允許你向物件提供其依賴項(xiàng),而無需明確地創(chuàng)建它們。在單元測(cè)試中,DI 可以幫助你隔離要測(cè)試的程式碼,並使測(cè)試更容易設(shè)定和維護(hù)。

Golang 中的DI

Golang 中有許多流行的DI 庫(kù),其中最著名的是[wire](https://github.com/google/ wire) 和[go-inject](https://github.com/go-inject/go-inject)。這些庫(kù)的工作原理是產(chǎn)生可以用作測(cè)試中依賴項(xiàng)的樁或模擬。

設(shè)定DI 測(cè)試

以下是如何使用wire 設(shè)定DI 單元測(cè)試:

import (
    "context"
    "testing"

    "github.com/google/go-cmp/cmp"
)

// Interface we want to test.
type Greeter interface {
    Greet(ctx context.Context, name string) (string, error)
}

// Implementation we want to test.
type DefaultGreeter struct{}

func (g DefaultGreeter) Greet(ctx context.Context, name string) (string, error) {
    return "Hello, " + name, nil
}

func TestGreeter_Greet(t *testing.T) {
    type Fields struct {
        greeter Greeter
    }

    wire.Build(Fields{
        greeter: (*DefaultGreeter)(nil),
    })

    cases := []struct {
        setup    func(t *testing.T, fields Fields)
        expected *string
        wantErr  bool
    }{
        {
            expected: String("Hello, Bob"),
        },
    }

    for _, tc := range cases {
        tc := tc // capture range variable
        t.Run(testName, func(t *testing.T) {
            t.Parallel()

            fields := Fields{}
            tc.setup(t, fields)

            result, err := fields.greeter.Greet(context.Background(), "Bob")

            if (err != nil) != tc.wantErr {
                t.Fatalf("error = %v, wantErr = %v", err, tc.wantErr)
            }
            if tc.wantErr {
                return
            }
            if diff := cmp.Diff(*tc.expected, result); diff != "" {
                t.Fatalf("result mismatch (-want +got):\n%s", diff)
            }
        })
    }
}

使用DI 進(jìn)行測(cè)試

#在上面的測(cè)試中,我們使用

wire.Build 來產(chǎn)生一個(gè)Fields 結(jié)構(gòu)的實(shí)例,該實(shí)例包含要用於測(cè)試的依賴項(xiàng)樁。然後,我們可以像往常一樣設(shè)定測(cè)試案例並斷言結(jié)果。

實(shí)戰(zhàn)案例

以下是如何使用DI 單元測(cè)試一個(gè)處理HTTP 請(qǐng)求的函數(shù):

import (
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/gorilla/mux"
    "github.com/stretchr/testify/assert"

    "mypkg/handlers"
)

// Interface we want to test.
type UserService interface {
    GetUser(id int) (*User, error)
}

// Implementation we want to test.
type DefaultUserService struct{}

func (s DefaultUserService) GetUser(id int) (*User, error) {
    return &User{ID: id, Name: "Bob"}, nil
}

type Request struct {
    UserService UserService
}

func (r Request) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    id, err := strconv.Atoi(mux.Vars(req)["id"])
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    user, err := r.UserService.GetUser(id)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Fprintf(w, "%s", user.Name)
}

func TestHandler_GetUser(t *testing.T) {
    r := &Request{}

    type Fields struct {
        userService UserService
    }

    wire.Build(Fields{
        userService: (*DefaultUserService)(nil),
    })

    cases := []struct {
        name string
        id   int
        body string
        want string
    }{
        {
            body: `{"body":""}`,
            want: `Bob`,
        },
        {
            id:   2,
            body: `{"body":""}`,
            want: `Bob`,
        },
    }

    for _, tc := range cases {
        tc := tc // capture range variable
        t.Run(tc.name, func(t *testing.T) {
            req, _ := http.NewRequest("GET", "/", bytes.NewBuffer([]byte(tc.body)))
            if tc.id != 0 {
                req = mux.SetURLVars(req, map[string]string{"id": strconv.Itoa(tc.id)})
            }
            rr := httptest.NewRecorder()
            handler := http.HandlerFunc(r.ServeHTTP)
            handler.ServeHTTP(rr, req)

            assert.Equal(t, tc.want, rr.Body.String())
        })
    }
}

透過使用DI 和樁,我們能夠輕鬆地隔離和測(cè)試

GetUser 函數(shù),而無需涉及實(shí)際的資料庫(kù)或HTTP 請(qǐng)求。

以上是如何在 Golang 中使用依賴注入進(jìn)行單元測(cè)試?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在 Golang 單元測(cè)試中使用 gomega 進(jìn)行斷言? 如何在 Golang 單元測(cè)試中使用 gomega 進(jìn)行斷言? Jun 05, 2024 pm 10:48 PM

如何在Golang單元測(cè)試中使用Gomega進(jìn)行斷言在Golang單元測(cè)試中,Gomega是一個(gè)流行且功能強(qiáng)大的斷言庫(kù),它提供了豐富的斷言方法,使開發(fā)人員可以輕鬆驗(yàn)證測(cè)試結(jié)果。安裝Gomegagoget-ugithub.com/onsi/gomega使用Gomega進(jìn)行斷言以下是使用Gomega進(jìn)行斷言的一些常用範(fàn)例:1.相等斷言import"github.com/onsi/gomega"funcTest_MyFunction(t*testing.T){

如何在 Golang 單元測(cè)試中使用表格驅(qū)動(dòng)的測(cè)試方法? 如何在 Golang 單元測(cè)試中使用表格驅(qū)動(dòng)的測(cè)試方法? Jun 01, 2024 am 09:48 AM

表驅(qū)動(dòng)的測(cè)試在Go單元測(cè)試中透過表定義輸入和預(yù)期輸出簡(jiǎn)化了測(cè)試案例編寫。語(yǔ)法包括:1.定義一個(gè)包含測(cè)試案例結(jié)構(gòu)的切片;2.循環(huán)遍歷切片並比較結(jié)果與預(yù)期輸出。在實(shí)戰(zhàn)案例中,對(duì)字串轉(zhuǎn)換大寫的函數(shù)進(jìn)行了表格驅(qū)動(dòng)的測(cè)試,並使用gotest運(yùn)行測(cè)試,列印通過結(jié)果。

PHP單元測(cè)試:如何設(shè)計(jì)有效的測(cè)試案例 PHP單元測(cè)試:如何設(shè)計(jì)有效的測(cè)試案例 Jun 03, 2024 pm 03:34 PM

設(shè)計(jì)有效的單元測(cè)試案例至關(guān)重要,遵循以下原則:原子性、簡(jiǎn)潔、可重複和明確。步驟包括:確定要測(cè)試的程式碼、識(shí)別測(cè)試場(chǎng)景、建立斷言、編寫測(cè)試方法。實(shí)戰(zhàn)案例示範(fàn)了為max()函數(shù)建立測(cè)試案例,強(qiáng)調(diào)了特定測(cè)試場(chǎng)景和斷言的重要性。透過遵循這些原則和步驟,可以提高程式碼品質(zhì)和穩(wěn)定性。

PHP 單元測(cè)試:增加程式碼覆蓋率的技巧 PHP 單元測(cè)試:增加程式碼覆蓋率的技巧 Jun 01, 2024 pm 06:39 PM

PHP單元測(cè)試中提高程式碼覆蓋率的方法:使用PHPUnit的--coverage-html選項(xiàng)產(chǎn)生覆蓋率報(bào)告。使用setAccessible方法覆寫私有方法和屬性。使用斷言覆蓋布林條件。利用程式碼審查工具獲得額外的程式碼覆蓋率洞察。

解釋PHP中依賴注射(DI)的概念。 解釋PHP中依賴注射(DI)的概念。 Apr 05, 2025 am 12:07 AM

在PHP中使用依賴注入(DI)的核心價(jià)值在於實(shí)現(xiàn)松耦合的系統(tǒng)架構(gòu)。 DI通過外部提供依賴的方式減少類之間的直接依賴關(guān)係,提高代碼的可測(cè)試性和靈活性。使用DI時(shí),可以通過構(gòu)造函數(shù)、設(shè)值方法或接口注入依賴,並結(jié)合IoC容器管理對(duì)像生命週期和依賴關(guān)係。

PHP依賴注入容器:快速啟動(dòng) PHP依賴注入容器:快速啟動(dòng) May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強(qiáng)codemodocultion,可驗(yàn)證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP 單元測(cè)試基礎(chǔ):編寫穩(wěn)健且可維護(hù)的程式碼 PHP 單元測(cè)試基礎(chǔ):編寫穩(wěn)健且可維護(hù)的程式碼 Jun 03, 2024 am 10:17 AM

PHPUnit是一種流行的PHP單元測(cè)試框架,可用於編寫穩(wěn)健且可維護(hù)的測(cè)試案例。其中包含以下步驟:安裝PHPUnit和建立tests目錄來儲(chǔ)存測(cè)試檔案。建立一個(gè)繼承PHPUnit\Framework\TestCase的測(cè)試類別。定義以“test”開頭的測(cè)試方法來描述要測(cè)試的功能。使用斷言來驗(yàn)證預(yù)期結(jié)果與實(shí)際結(jié)果的一致性。執(zhí)行vendor/bin/phpunit從專案根目錄執(zhí)行測(cè)試。

PHP中的依賴注入:初學(xué)者的代碼示例 PHP中的依賴注入:初學(xué)者的代碼示例 May 14, 2025 am 12:08 AM

你應(yīng)該關(guān)心DependencyInjection(DI),因?yàn)樗茏屇愕拇a更清晰、更易維護(hù)。 1)DI通過解耦類,使其更模塊化,2)提高了測(cè)試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關(guān)係,但要注意性能影響和循環(huán)依賴問題,4)最佳實(shí)踐是依賴於抽象接口,實(shí)現(xiàn)鬆散耦合。

See all articles