How to test a function's output (stdout/stderr) in unit tests

后端 未结 3 690
轮回少年
轮回少年 2020-11-28 12:13

I have a simple function I want to test:

func (t *Thing) print(min_verbosity int, message string) {
    if t.verbosity >= minv {
        fmt.Print(message         


        
3条回答
  •  -上瘾入骨i
    2020-11-28 12:43

    You can do one of two things. The first is to use Examples.

    The package also runs and verifies example code. Example functions may include a concluding line comment that begins with "Output:" and is compared with the standard output of the function when the tests are run. (The comparison ignores leading and trailing space.) These are examples of an example:

    func ExampleHello() {
            fmt.Println("hello")
            // Output: hello
    }
    

    The second (and more appropriate, IMO) is to use fake functions for your IO. In your code you do:

    var myPrint = fmt.Print
    
    func (t *Thing) print(min_verbosity int, message string) {
        if t.verbosity >= minv {
            myPrint(message) // N.B.
        }
    }
    

    And in your tests:

    func init() {
        myPrint = fakePrint // fakePrint records everything it's supposed to print.
    }
    
    func Test...
    

    Another option is to use fmt.Fprintf with an io.Writer that is os.Stdout in production code, but may be say bytes.Buffer in tests.

提交回复
热议问题