单位测试 mock 内部函数向 chan 发送数据

单元测试设置 mock 函数实现向 chan 发送数据。

地址:https://stackoverflow.com/questions/58292558/set-data-in-a-channel-which-is-actually-set-by-a-mocked-function-for-unit-tests/58296480#58296480

标签:Go

详情描述

我正在尝试为一个方法 (methodA) 编写测试用例,该方法的内部使用了 hystrix.Go. 通过 hystrix.Go,我调用了外部的方法 A.somefunc,它以一个 channel 作为参数,在内部代码中向 channel 发送数据。我想编写单元测试来向 channel 发送数据,测试所有的可能,是否可能呢?

func methA() {
    // some code
    channel := make(chan []string, 1)
    hystrix.Go("x", func() error {
        return A.somefunc(channel)
    }, nil)
    // some code which uses channel
}

我的回答

测试使用 channel 数据的代码吗?可以尝试下 mock A.somefunc

一个例子如下:

func TestMethA(t testing.T) {
    // All possibilities
    cases := struct {
        data []interface{}  // data that send to channel
        want interface{}
    } {
        // ...
    }

	somefunc := A.somefunc
	// 重置 somefunc,防止印象其他用例
    defer func () {
        A.somefunc = somefunc
    }()

    for c := range cases {
        A.somefunc = func(c chan) error {
            // set data into the channel.
        }

        // call methodA,执行测试潘丹
        methodA()
    }
}