在go中嘲笑。有简单的方法吗?

del*_*lta 0 testing unit-testing mocking go

我来自 python,我一直在寻找一种在 go 中编写 yess 的方法。我在 SO 上遇到了一些事情,但对于那些应该一直需要的东西来说,它们看起来都非常麻烦和冗长。

我现在正在手机上打字,如果需要的话稍后会添加代码......但是例如......

假设我有一个调用smtp.Send中间某处的函数。我怎样才能轻松测试这个功能?

假设我有另一个命中一些外部 api(需要模拟),然后获取响应并调用类似ioutil.Readall()...我如何通过这个测试函数并模拟对 api 的调用,然后传递一些假响应数据什么时候Readall被调用?

Ara*_*ash 5

您可以使用界面来完成此操作。例如,假设您有一个名为 Mailer 的界面:

type Mailer interface {
    Send() error
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将 Mailer 对象嵌入到调用该方法的函数中Send

type Processor struct {
    Mailer
}

func (p *Processor) Process() {
    _ = p.Mailer.Send()
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的测试中,您可以创建一个模拟邮件程序。

type mockMailer struct{}
//implement the Send on the mockMailer as you wish

p := &Processor{
    Mailer: mockMailer,
}

p.Process()
Run Code Online (Sandbox Code Playgroud)

p.Process到达该Send方法时,它会调用您的模拟Send方法。