登录
首页 >  Golang >  Go问答

如何在Go中模拟函数?

来源:stackoverflow

时间:2024-04-14 10:09:32 259浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《如何在Go中模拟函数?》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

package main

import (
    "net/http"
    "sync"
    "time"
)

type sessioninterface1 interface {
    dologinandreaddestinations1() bool
}

type session1 struct {
    sessioncookie string
    mux           sync.mutex
    sessiontime   time.time
    targetaddress string
    currentjwt    string
    transport     *http.transport
}

var currentsession1 session1

func main() {

    currentsession1.verifylogin1()

}

func (s *session1) dologinandreaddestinations1() bool {
    ..logic...
    ... for example return true

}

func calldest1(si sessioninterface1) bool {
    return si.dologinandreaddestinations1()
}

func (s *session1) verifylogin1() bool {
    return calldest1(s)
}

我想创建单元测试并模拟 dologinandreaddestinations1 我尝试为此方法创建接口并创建测试

func test1(t *testing.T) {
    type args struct {
    }
    tests := []struct {
        name string
        args args
        want bool
    }{{
        name: "test",
        args: args{},
        want: false,
    }}
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            var s1 *Session1
            count := 10
            s1 = &Session1{"", sync.Mutex{}, time.Now(), "", "", nil}

            var got1 = s1.verifyLogin()

            if got1 != tt.want {
                t.Errorf("getJwt() = %v, want %v", got, tt.want)
            }

        })
    }
}

我不知道如何更改测试中函数 dologinandreaddestinations1 的逻辑以及更改第一个 main 中的逻辑


解决方案


您需要抽象出您想要模拟的所有内容。不要将依赖关系作为具体实现来解决,而是使用接口。然后您将能够创建一个实现此接口的模拟。

一般情况下,我建议您使用stretchr/testify进行测试。它有以下方法:

  1. 断言
  2. 需要
  3. 模拟
  4. 套房

该库将帮助您构建测试、编写测试并删除样板代码。 它内部有模拟机制。在 testify mock section 阅读有关模拟接口的信息

在单元测试中,您仅调用 Session1 上的方法,而不是调用 Session1 方法的东西;所以没有什么可嘲笑的。使用模拟进行测试时,您不会模拟方法,而是模拟类型,而这些类型是被测类型的依赖项。例如,如果您有一个类型 Foo ,它依赖于(调用其方法)类型 Bar ,并且您想要单独测试 Foo ,您可以创建一个 Bar 类型的模拟,并且在 Foo 的测试中,您可以给出它是您的 BarMock 而不是 Bar。在您的真实代码中,您将给它真正的 Bar。无法模拟类型的单个方法。

您可能会发现 this StackOverflow question 及其广泛的答案很有帮助。

好了,本文到此结束,带大家了解了《如何在Go中模拟函数?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>