亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

模擬 go 方法

模擬 go 方法

Go
30秒到達戰場 2023-04-04 14:39:23
我正在寫一個小的 POC 去上班,但我似乎無法弄清楚模擬技術。這是我到目前為止...連接.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}連接測試.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)    }}如您所見,這是一個簡單的數據庫連接邏輯,我使用接口對其進行了測試和模擬。我想覆蓋 100% 的代碼,所以我必須模擬某些方法。上面的代碼雖然有效,但第二個測試失敗了,可能是因為我在嘗試模擬它時遺漏了一些東西。請幫忙..
查看完整描述

1 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您可以做幾件事。


簡單的方法

如果你想保持簡單,你可以做的是讓你的模擬結構具有它應該返回的字段,并且在每個測試用例中你將這些字段設置為你的模擬應該為該測試用例返回的內容。


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


此外,您不需要dbMock接口,因為dbConnMock實現了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

}

現在,您可以通過使用驗證您的方法是否使用預期參數調用FileCalled,并且可以使其具有您想要模擬的行為。


如果你還想確保你的方法只被調用一次,你還可以添加一個計數器來查看它被調用了多少次。


使用模擬庫

如果您不想擔心編寫該邏輯,一些庫可以為您完成,例如testify/mock。


這是一個簡單的模擬如何使用的示例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

        })

    }

}

此代碼確保您的方法被調用一次并使用特定參數,并將使其返回測試用例中指定的內容。


查看完整回答
反對 回復 2023-04-04
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號