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

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

模擬 go 方法

模擬 go 方法

我正在寫一個(gè)小的 POC 去上班,但我似乎無法弄清楚模擬技術(shù)。這是我到目前為止...連接.gopackage dbimport (    "database/sql"    "encoding/json"    "fmt"    "io/ioutil"    "strings"    _ "github.com/lib/pq")type config map[string]interface{}type DbConn struct {    db db}type db interface {    getConnectionStringFromConfig(file string) (connStr string, err error)}func NewDbConn(d db) *DbConn {    return &DbConn{db: d}}func getConnectionStringFromConfig(file string) (connStr string, err error) {    var c config    var bt []byte    if bt, err = ioutil.ReadFile(file); err != nil {        fmt.Printf("Error Reading config file: %v", err)        return    }    fmt.Println("Finish reading file. Going to construct a connection string")    if err = json.Unmarshal(bt, &c); err != nil {        fmt.Printf("Error unmarshalling config file: %v", err)        return    }    connStr = strings.TrimLeft(getConfigAsString(c), " ")    return}func getConfigAsString(c config) (connStr string) {    for k, v := range c {        connStr += strings.Join([]string{" " + k, v.(string)}, "=")    }    return}// Connect database connectionfunc (dbConn DbConn) Connect() (conn *sql.DB, err error) {    fmt.Println("Starting database connection...")    connStr, err := getConnectionStringFromConfig("path/to/conf.json")    if err != nil {        return    }    conn, err = sql.Open("some_driver", connStr)    return}連接測(cè)試.gopackage dbimport (    "errors"    "testing")type dbConnMock struct {    db dbMock}type dbMock interface {    getConnectionStringFromConfig(file string) (connStr string, err error)}func (dbm dbConnMock) getConnectionStringFromConfig(file string) (connStr string, err error) {    return "", errors.New("123")}// should not throw error when trying to open db connectionfunc TestDatabaseConnection(t *testing.T) {    dbCon := &DbConn{}    _, err := dbCon.Connect()    if err != nil {        t.Errorf("test failed. \n %d", err)    }}如您所見,這是一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)連接邏輯,我使用接口對(duì)其進(jìn)行了測(cè)試和模擬。我想覆蓋 100% 的代碼,所以我必須模擬某些方法。上面的代碼雖然有效,但第二個(gè)測(cè)試失敗了,可能是因?yàn)槲以趪L試模擬它時(shí)遺漏了一些東西。請(qǐng)幫忙..
查看完整描述

1 回答

?
喵喔喔

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

您可以做幾件事。


簡(jiǎn)單的方法

如果你想保持簡(jiǎn)單,你可以做的是讓你的模擬結(jié)構(gòu)具有它應(yīng)該返回的字段,并且在每個(gè)測(cè)試用例中你將這些字段設(shè)置為你的模擬應(yīng)該為該測(cè)試用例返回的內(nèi)容。


這樣,您可以以不同的方式使模擬成功或失敗。


此外,您不需要dbMock接口,因?yàn)閐bConnMock實(shí)現(xiàn)了db接口,這就是您所需要的。


這是您的模擬的樣子:


type dbConnMock struct {

    FileCalled string


    connStr string

    err error

}


func (dbm dbConnMock) getConnectionStringFromConfig(file string) (connStr string, err error) {

    dbm.FileCalled = file

    return dbm.connStr, dbm.err

}

現(xiàn)在,您可以通過使用驗(yàn)證您的方法是否使用預(yù)期參數(shù)調(diào)用FileCalled,并且可以使其具有您想要模擬的行為。


如果你還想確保你的方法只被調(diào)用一次,你還可以添加一個(gè)計(jì)數(shù)器來查看它被調(diào)用了多少次。


使用模擬庫(kù)

如果您不想擔(dān)心編寫該邏輯,一些庫(kù)可以為您完成,例如testify/mock。


這是一個(gè)簡(jiǎn)單的模擬如何使用的示例testify/mock:


type dbMock struct {

    mock.Mock

}


func (m *dbMock) getConnectionStringFromConfig(file string) (string, error) {

    args := m.Called(file)


    return args.String(0), args.Error(1)

}


func TestSomething(t *testing.T) {

    tests := []struct {

        description string


        connStr string

        err error


        expectedFileName string


        // add expected outputs and inputs of your tested function

    }{

        {

            description: "passing test",


            connStr: "valid connection string",

            err: nil,


            expectedFileName: "valid.json",

        },

        {

            description: "invalid file",


            connStr: "",

            err: errors.New("invalid file"),


            expectedFileName: "invalid.json",

        },

    }


    for _, test := range tests {

        t.Run(test.description, func(t *testing.T) {


            dbMock := &dbConnectionMock{}

            dbMock.

                On("getConnectionStringFromConfig", test.expectedFileName).

                Return(test.connStr, test.err).

                Once()


            thing := &Something{

                db: dbMock,

            }


            output, err := thing.doSomething()


            // assert that output and err are expected


            dbMock.AssertExpectations(t) // this will make sure that your mock is only used as expected in your test, depending on your `On` calls

        })

    }

}

此代碼確保您的方法被調(diào)用一次并使用特定參數(shù),并將使其返回測(cè)試用例中指定的內(nèi)容。


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

添加回答

舉報(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)