测试Golang中的handler中调用该方法

Vin*_*nay 4 unit-testing go

我正在 Golang 中实现一个 API。我有一个端点,我在其中调用带有其他包的参数的方法。现在我需要检查请求中是否已调用该方法。

下面是我正在做的和我期待的类似的小场景。

我的经纪人

package myPackage
import (
    "log"
    "github.com/myrepo/notifier" // my another package
)

func MyHandler(writer http.ResponseWriter, request *http.Request) { 
    // ...
    // ...

    notifier.Notify(4, "sdfsdf")

    // ...
    // ...

}
Run Code Online (Sandbox Code Playgroud)

测试处理程序

func TestMyHandler(t *testing.T) {
    // Here I want to 
    req, _ := http.NewRequest("GET", "/myendpoint", nil)
    // ... Want to test that notifier.Notify is called
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在 TestMyHandler 中,我想检查是否notifier.Notify已调用。

发现

我试图理解AssertNumberOfCallsfunc (*Mock) Calledfunc (*Mock) MethodCalled但我不确定如何使用它们:(。

我是 Golang 的新手,对此我感到非常兴奋。如果我错过了任何内容,请告诉我,或者您可能需要更多信息才能更好地理解。

Mat*_*udy 7

这是使用依赖注入和接口的好机会。

也就是说,我们需要提取一个概念Notifier

(警告:代码未直接测试)

type Notifier interface {
    Notify(int, string)() error
}
Run Code Online (Sandbox Code Playgroud)

现在,为了避免与notifier库产生任何混淆,请使用本地别名。

import "github.com/myrepo/notifier" mynotifier
Run Code Online (Sandbox Code Playgroud)

然后,因为您使用的库将其导出为函数,而不是在结构中,所以我们需要创建一个实现我们的接口的结构

type myNotifier struct {}

func (mn *myNotifier) Notify(n int, message string) error {
  return mynotifier.Notify(n, message)
}
Run Code Online (Sandbox Code Playgroud)

然后修改你的函数:

func MyHandler(writer http.ResponseWriter, request *http.Request, notifier Notifier) { 
    // ...
    // ...

    notifier.Notify(4, "sdfsdf")

    // ...
    // ...

}
Run Code Online (Sandbox Code Playgroud)

然后在您的测试中,您现在可以自由发送间谍通知程序

type spyNotifier struct {
  called boolean
}

func (n *spyNotifier) Notify(n int, msg string) error {
  n.called = true
  return
}
Run Code Online (Sandbox Code Playgroud)