在Golang中模拟内部功能 [英] Mock inner function in golang

查看:82
本文介绍了在Golang中模拟内部功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用接口来模拟函数,并且能够模拟第一个函数callsomethingicza的大力帮助下,现在变得有些棘手了.我想测试功能vl1 使用模拟功能 function1,该怎么做.

I want to mock function using interface and I was able to mock the first function callsomething With great help from icza , Now it’s a bit more tricky . I want to test function vl1 With mock for function function1 , how it can be done.

https://play.golang.org/p/w367IOjADFV

软件包主要

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中模拟函数,则必须声明一个将保存该函数值的变量,让该函数的所有调用方都使用该变量相反,然后在测试期间,您可以为模拟实现切换功能值.

If you want to mock a function in Go you'll have to declare a variable that will hold the function value, have all callers of the function use the variable instead and then during tests you can switch up the function value for a mock implementation.

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
    }()
    // ...

这篇关于在Golang中模拟内部功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆