来自 golang 包的模拟方法
Mocking method from golang package
我一直无法找到从 golang 包中模拟方法的解决方案。
例如,我的项目有代码在 Os.Getwd() return 出现错误时尝试恢复。我能想到的对此进行单元测试的最简单方法是将 Os.Getwd() 方法模拟为 return 一个错误,并验证代码是否相应地工作。
我试过使用 testify,但似乎不可行。
有人对此有经验吗?
我自己的解决方案是将该方法作为参数,这允许在测试时注入 "mock" 而不是。此外,创建一个导出方法作为 public 门面和一个未导出的方法用于测试。
示例:
func Foo() int {
return foo(os.Getpid)
}
func foo(getpid func() int) int {
return getpid()
}
看起来 os.Getwd test 可以为您提供一些示例,说明如何测试您的代码。查找函数 TestChdirAndGetwd
和 TestProgWideChdir
.
从阅读这些内容来看,测试似乎创建了临时文件夹。
因此,一种实用的方法是创建临时文件夹,就像上面提到的测试所做的那样,然后破坏它们,这样 os.Getwd
就会抛出一个错误让您在测试中发现错误。
请小心执行这些操作,因为它们可能会扰乱您的系统。我建议在轻量级容器或虚拟机中进行测试。
我知道这有点晚了,但是,这是你可以做到的。
测试 DAL 或 SystemCalls 或包调用通常很困难。我解决这个问题的方法是将你的系统函数调用推到一个接口后面,然后模拟这些接口的函数。例如。
type SystemCalls interface {
Getwd() error
}
type SystemCallsImplementation struct{
}
func (SystemCallsImplementation) Getwd() error{
return Os.Getwd()
}
func MyFunc(sysCall SystemCalls) error{
sysCall.Getwd()
}
通过这个,您可以注入具有系统调用功能的接口。现在您可以轻松创建用于测试的接口的模拟实现。
喜欢
type MockSystemCallsImplementation struct{
err error
}
func (MockSystemCallsImplementation) Getwd() error{
return err //this can be set to nil or some value in your test function
}
希望这能回答您的问题。
这是 go 编译器的限制,google 开发人员不希望允许任何 hooks 或 monkey patching。如果单元测试对您很重要 - 那么您必须 select 一种源代码中毒的方法。所有这些方法如下:
- 不能直接使用全局包。
- 您必须创建方法的隔离版本并对其进行测试。
- 方法的生产版本包括方法的隔离版本和全局包。
但最好的解决方案是完全忽略 go 语言(如果可能的话)。
我一直无法找到从 golang 包中模拟方法的解决方案。
例如,我的项目有代码在 Os.Getwd() return 出现错误时尝试恢复。我能想到的对此进行单元测试的最简单方法是将 Os.Getwd() 方法模拟为 return 一个错误,并验证代码是否相应地工作。
我试过使用 testify,但似乎不可行。
有人对此有经验吗?
我自己的解决方案是将该方法作为参数,这允许在测试时注入 "mock" 而不是。此外,创建一个导出方法作为 public 门面和一个未导出的方法用于测试。
示例:
func Foo() int {
return foo(os.Getpid)
}
func foo(getpid func() int) int {
return getpid()
}
看起来 os.Getwd test 可以为您提供一些示例,说明如何测试您的代码。查找函数 TestChdirAndGetwd
和 TestProgWideChdir
.
从阅读这些内容来看,测试似乎创建了临时文件夹。
因此,一种实用的方法是创建临时文件夹,就像上面提到的测试所做的那样,然后破坏它们,这样 os.Getwd
就会抛出一个错误让您在测试中发现错误。
请小心执行这些操作,因为它们可能会扰乱您的系统。我建议在轻量级容器或虚拟机中进行测试。
我知道这有点晚了,但是,这是你可以做到的。
测试 DAL 或 SystemCalls 或包调用通常很困难。我解决这个问题的方法是将你的系统函数调用推到一个接口后面,然后模拟这些接口的函数。例如。
type SystemCalls interface {
Getwd() error
}
type SystemCallsImplementation struct{
}
func (SystemCallsImplementation) Getwd() error{
return Os.Getwd()
}
func MyFunc(sysCall SystemCalls) error{
sysCall.Getwd()
}
通过这个,您可以注入具有系统调用功能的接口。现在您可以轻松创建用于测试的接口的模拟实现。
喜欢
type MockSystemCallsImplementation struct{
err error
}
func (MockSystemCallsImplementation) Getwd() error{
return err //this can be set to nil or some value in your test function
}
希望这能回答您的问题。
这是 go 编译器的限制,google 开发人员不希望允许任何 hooks 或 monkey patching。如果单元测试对您很重要 - 那么您必须 select 一种源代码中毒的方法。所有这些方法如下:
- 不能直接使用全局包。
- 您必须创建方法的隔离版本并对其进行测试。
- 方法的生产版本包括方法的隔离版本和全局包。
但最好的解决方案是完全忽略 go 语言(如果可能的话)。