我正在 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已调用。
我试图理解AssertNumberOfCalls、func (*Mock) Called和func (*Mock) MethodCalled但我不确定如何使用它们:(。
我是 Golang 的新手,对此我感到非常兴奋。如果我错过了任何内容,请告诉我,或者您可能需要更多信息才能更好地理解。
这是使用依赖注入和接口的好机会。
也就是说,我们需要提取一个概念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)