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

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

如何使用具有差異實現(xiàn)的函數(shù)接口

如何使用具有差異實現(xiàn)的函數(shù)接口

Go
千巷貓影 2023-05-04 17:24:35
我正在使用interface它,我想在測試中模擬其中的一種方法 function1,但我無法弄清楚如何最好地做到這一點,對于產(chǎn)品代碼,它將提供 1 個值,對于測試,提供一些模擬值,有人可以嗎舉個例子?(編輯)這是代碼:https://play.golang.org/p/w367IOjADFVpackage mainimport (    "fmt"    "time")type vInterface interface {    function1() bool}type mStruct struct {    info string    time time.Time}func (s *mStruct) function1() bool {    return true}func callSomething(si vInterface) bool {    return si.function1()}func (s *mStruct) vl1() bool {    s.time = time.Now()    s.info = "vl1->info"    return callSomething(s)}var currentVt1 mStructfunc main() {    vl1 := currentVt1.vl1()    fmt.Println(vl1)}測試是這樣的func Test_callSomething(t *testing.T) {    type args struct {        si vInterface    }    tests := []struct {        name string        args args        want bool    }{        {            name: "my tests",            args: args{            },            want: false,        },    }    for _, tt := range tests {        t.Run(tt.name, func(t *testing.T) {            if got := callSomething(tt.args.si); got != tt.want {                t.Errorf("callSomething() = %v, want %v", got, tt.want)            }        })    }}但不確定如何正確地嘲笑它......
查看完整描述

1 回答

?
qq_笑_17

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

首先,您需要一個實現(xiàn)該vInterface接口的類型(任何類型)。這是一個簡單的例子:


type mockedVInterface struct {

    value bool

}


func (m mockedVInterface) function1() bool {

    return m.value

}

這是一個我們可以控制的足夠簡單的實現(xiàn):我們可以function1()通過簡單地將那個值設(shè)置到它的字段來告訴它的函數(shù)應(yīng)該返回什么value。


此mockedVInterface類型僅為測試目的而創(chuàng)建,生產(chǎn)代碼不需要它。把它放在你有測試代碼的同一個文件中(放在前面Test_callSomething())。


這是測試代碼:


func Test_callSomething(t *testing.T) {

    type args struct {

        si vInterface

    }

    tests := []struct {

        name string

        args args

        want bool

    }{

        {

            name: "testing false",

            args: args{

                si: mockedVInterface{value: false},

            },

            want: false,

        },

        {

            name: "testing true",

            args: args{

                si: mockedVInterface{value: true},

            },

            want: true,

        },

    }

    for _, tt := range tests {

        t.Run(tt.name, func(t *testing.T) {

            if got := callSomething(tt.args.si); got != tt.want {

                t.Errorf("callSomething() = %v, want %v", got, tt.want)

            }

        })

    }

}

請注意,在這個簡單的例子中,我們還可以使用一個簡單的非結(jié)構(gòu)類型,bool它的底層類型如下:


type mockedVInterface bool


func (m mockedVInterface) function1() bool {

    return bool(m)

}

它有效并且測試代碼也更簡單:


tests := []struct {

        name string

        args args

        want bool

    }{

        {

            name: "testing false",

            args: args{

                si: mockedVInterface(false),

            },

            want: false,

        },

        {

            name: "testing true",

            args: args{

                si: mockedVInterface(true),

            },

            want: true,

        },

    }

但這僅在可模擬接口具有具有單個返回值的單個函數(shù)時才有效。在一般情況下,需要一個結(jié)構(gòu)。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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