Go 哥朗的模拟内函数
我想使用接口模拟函数,并且我能够模拟第一个函数Go 哥朗的模拟内函数,go,dependency-injection,interface,Go,Dependency Injection,Interface,我想使用接口模拟函数,并且我能够模拟第一个函数callsomething 在icza的大力帮助下,现在变得有点棘手了。我想测试功能vl1 使用函数模拟function1,如何实现 包干管 import ( "fmt" "time" "testing" ) type vInterface interface { function1() bool } type mStruct struct { info string time time.Time
callsomething
在icza
的大力帮助下,现在变得有点棘手了。我想测试功能vl1
使用函数模拟function1
,如何实现
包干管
import (
"fmt"
"time"
"testing"
)
type vInterface interface {
function1() bool
}
type mStruct struct {
info string
time time.Time
}
func (s *mStruct) function1() bool {
return true
}
func callSomething(si vInterface) bool {
return si.function1()
}
func (s *mStruct) vl1() bool {
return callSomething(s)
}
var currentVt1 mStruct
func main() {
vl1 := currentVt1.vl1()
fmt.Println(vl1)
}
//——————————————————TESTS——————————————————
// This test is working as expected (as suggested by icza) for the function "callSomething"
// here we use mock interface and mock function which helps to mock function1
type mockedVInterface struct {
value bool
}
func (m mockedVInterface) fn1() bool {
return m.value
}
func Test_callSomething(t *testing.T) {
type args struct {
si vInterface
}
tests := []struct {
name string
args args
want bool
}{
{
name: "first value",
args: args{
si: mockedVInterface{value: false},
},
want: false,
},
{
name: "second value",
args: args{
si: mockedVInterface{value: true},
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := callSomething(tt.args.si); got != tt.want {
t.Errorf("callSomething() = %v, want %v", got, tt.want)
}
})
}
}
//----Here is the test which a bit tricky
//I want to call to "s.vl1()" and test it with mock for "function1"
func Test_mStruct_vl1(t *testing.T) {
type fields struct {
info string
time time.Time
}
tests := []struct {
name string
fields fields
want bool
}{
{
name: "test 2",
fields: struct {
info string
time time.Time
}{info: "myinfo", time: time.Now() },
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := &mStruct{
info: tt.fields.info,
time: tt.fields.time,
}
//here the test is starting
if got := s.vl1(); got != tt.want {
t.Errorf("mStruct.vl1() = %v, want %v", got, tt.want)
}
})
}
}
如果要在Go中模拟函数,则必须声明一个包含函数值的变量,让函数的所有调用者使用该变量,然后在测试期间,可以为模拟实现切换函数值
func callSomethingFunc(si vInterface) bool {
return si.function1()
}
var callSomething = callSomethingFunc
func (s *mStruct) vl1() bool {
return callSomething(s)
}
// ...
func Test_mStruct_vl1(t *testing.T) {
callSomething = func(si vInterface) bool { // set mock
// do mock stuff
}
defer func(){
callSomething = callSomethingFunc // set back original func at end of test
}()
// ...
将callSomething更改为var,例如,在测试之前,将var设置为mock func,运行测试,将其设置回原始func。@mkopriva-我应该在哪里更改它?在测试中还是在实现中?请编辑此内容并将其作为答案提供给implementation@mkopriva-我现在正在检查,谢谢!还可以考虑使用DI框架来将结构注入到其他结构中,使得在特定测试中很容易模拟特定的事物。