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

标签 go glide-golang

我正在尝试 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/

相关文章:

go - 尝试发出回显请求时收到无效的连接错误

regex - 匹配单斜线时的 golang 正则表达式错误

bash - MINGW64 "make build"错误 : "bash: make: command not found"

go - 来自 Opencensus Libraries for Golang 的 vendor 问题

go - Glide 更新无法检测到 VCS

unicode - 使用 Go 删除​​变音符号

go - 代理处理函数中 []byte 的字符串表示形式

pointers - 为什么指针上的方法在指针是变量时起作用,而在其他情况下不起作用?