gpt4 book ai didi

go - 在golang中从另一个内部调用的模拟函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:50 25 4
gpt4 key购买 nike

我正在尝试 stub os.Statioutil.ReadFile(path) 使用下面的代码或者如果你喜欢这里在 go playground [1]

package main

import (
"fmt"
"io/ioutil"
"os"
"strings"
)

func AssignFileValueFrom(path string, val *string) {
var (
tempValue []byte
err error
)

if _, err = os.Stat(path); err == nil {
if err != nil {
fmt.Println("There was a os stat error:", err)
}

tempValue, err = ioutil.ReadFile(path)
if err != nil {
fmt.Println("There was an io read error:", err)
}
*val = strings.TrimSpace(string(tempValue))
}
}

我已经使用 testify 并尝试按照此处的示例 [2]

package main

import (
"testing"

"github.com/stretchr/testify/mock"
)

type osMock struct {
mock.Mock
}

func (o osMock) Stat(path string) (interface{}, error) {
return nil, nil
}

func TestAssignFileValueFrom(t *testing.T) {
var test string
osm := new(osMock)
osm.On(`Stat`, `./.test`).Return([]byte(`1`), nil)

AssignFileValueFrom(`./.test`, &test)
// assert.Equal(t, `1`, test)
osm.AssertExpectations(t)
}

我做错了什么??

[1] https://play.golang.org/p/xcbdMkMwoBN

[2] https://github.com/stretchr/testify#mock-package

最佳答案

您使用 osMock 的代码不会影响 AssignFileValueFrom 函数的执行。有一个直接调用 os.Stat 并且它不会因为你在某处声明了 osMock 而被替换。
要进行实际测试,您应该使用接口(interface)和依赖注入(inject)来测试您的代码。
首先,必须将 os.Stat 调用替换为对您的结构的调用,该结构实现了定义了相同方法的接口(interface)。并且您需要至少创建此接口(interface)的 2 个实现:1 - 是要使用的实际工作代码,2 - 模拟要在测试中使用的 osMock 结构。您需要注入(inject)它或将其传递给 AssignFileValueFrom,然后使用它调用 Stat 方法。

关于go - 在golang中从另一个内部调用的模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com