在测试中覆盖接收器类型,并将依赖关系注入到逻辑中

使用 ,我正在尝试执行以下操作:Go v1.14.3


package main


import (

    "os"


    "github.com/mihaigalos/go-bar/bar"

)


var progressBar bar.Bar


func (*ProgressHandler) New(begin int, end int) {

    progressBar.New(begin, end)

}


func main() {

    var progressHandler ProgressHandler

    send(&progressHandler)

}

目前为止,一切都好。但是当我测试时,我不需要看到任何进度条,因此我的进度手柄可以是空的,并且我想依赖 - 将此对象注入到.里面它会调用我指定的.send()New()


package main


import (

    "testing"

)

func (*ProgressHandler) New(int, int) {

}


func TestSendWorks_whenTypical(t *testing.T) {

    expected := true

    var progressHandler ProgressHandler


    actual := send(&progressHandler)


    if actual != expected {

        t.Errorf("No Match: %b != %b", actual, expected)

    }

}

当我编译这个时,我得到了一个名称冲突与中定义的处理程序:main


integration_typical_test.go:23:25: (*ProgressHandler).New redeclared in this block

    previous declaration at main.go:15:6

我尝试将包的名称更改为其他名称。那里有同样的错误。我该如何改进?


叮当猫咪
浏览 149回答 1
1回答

慕仙森

使用接口。type ProgressBar interface {    New(int, int)}var progressBar bar.Bar// New implements ProgressBarfunc (*ProgressHandler) New(begin int, end int) {    progressBar.New(begin, end)}// change *ProgressHandler to ProgressBarfunc send(pb ProgressBar) {    // ...}func main() {    var progressHandler ProgressHandler    send(&progressHandler)}package mainimport (    "testing")type fakeProgressHandler struct{}func (*fakeProgressHandler) New(int, int) {}func TestSendWorks_whenTypical(t *testing.T) {    expected := true    var progressHandler fakeProgressHandler    actual := send(&progressHandler)    if actual != expected {        t.Errorf("No Match: %b != %b", actual, expected)    }}处理程序中的接收器。nilpackage mainimport (    "os"    "github.com/mihaigalos/go-bar/bar")var progressBar bar.Barfunc (h *ProgressHandler) New(begin int, end int) {    if h == nil {        return    }    progressBar.New(begin, end)}func main() {    var progressHandler ProgressHandler    send(&progressHandler)}package mainimport (    "testing")func TestSendWorks_whenTypical(t *testing.T) {    expected := true    actual := send(nil)    if actual != expected {        t.Errorf("No Match: %b != %b", actual, expected)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go