zoukankan      html  css  js  c++  java
  • go unit test-monkey

    package main
    
    import (
        "fmt"
        "github.com/bouk/monkey"
        "os"
        "os/exec"
        "reflect"
        "testing"
    )
    
    // 假如我们要测试函数 call
    func call(cmd string) (int, string) {
        bytes, err := exec.Command("sh", "-c", cmd).CombinedOutput()
        output := string(bytes)
        if err != nil {
            return 1, reportExecFailed(output)
        }
        return 0, output
    }
    
    // 上面的函数会调用它,这个函数一定要mock掉!
    func reportExecFailed(msg string) string {
        os.Exit(1) // 讨人嫌的副作用
        return msg
    }
    
    func TestExecSussess(t *testing.T) {
        // 恢复 patch 修改
        // 实际使用中会把 UnpatchAll 放到 teardown 函数里
        // 不过在 go 自带的 testing 里就这么处理了
        defer monkey.UnpatchAll()
        // mock 掉 exec.Command 返回的 *exec.Cmd 的 CombinedOutput 方法
        monkey.PatchInstanceMethod(
            reflect.TypeOf((*exec.Cmd)(nil)),
            "CombinedOutput", func(_ *exec.Cmd) ([]byte, error) {
                return []byte("results"), nil
            },
        )
        // mock 掉 reportExecFailed 函数
        monkey.Patch(reportExecFailed, func(msg string) string {
            return msg
        })
    
        rc, output := call("any")
        if rc != 0 {
            t.Fail()
        }
        if output != "results" {
            t.Fail()
        }
    }
    
    func TestExecFailed(t *testing.T) {
        defer monkey.UnpatchAll()
        // 上次 mock 的是执行成功的情况,这一次轮到执行失败
        monkey.PatchInstanceMethod(
            reflect.TypeOf((*exec.Cmd)(nil)),
            "CombinedOutput", func(_ *exec.Cmd) ([]byte, error) {
                return []byte(""), fmt.Errorf("sth bad happened")
            },
        )
        monkey.Patch(reportExecFailed, func(msg string) string {
            return msg
        })
    
        rc, output := call("any")
        if rc != 1 {
            t.Fail()
        }
        if output != "" {
            t.Fail()
        }
    }

    =====================================
    package main
    
    import (
        "fmt"
        "github.com/bouk/monkey"
        "strings"
    )
    
    func main() {
        var guard *monkey.PatchGuard
        guard = monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {
            s := make([]interface{}, len(a))
            for i, v := range a {
                s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1)
            }
            // 以下代码等价于
            // guard.Unpatch()
            // defer guard.Restore()
            // return fmt.Println(s...)
            guard.Unpatch()
            n, err = fmt.Println(s...)
            guard.Restore()
            return
        })
        fmt.Println("what the hell?") // what the *bleep*?
        fmt.Println("what the hell?") // what the *bleep*?
    }
  • 相关阅读:
    如何把阿里图标库的图标生成代码并应用于自己的项目
    【记事件】
    极光推送,为什么IOS有的手机一直收不到推送。
    浮点型的数据对比。
    MySQL通过show processlist查看项目的mysql写的有问题
    thinkPHP5实现简单的多图上传
    mac终端运行/终止jar包
    referer参数和addslashes()函数的骚路子
    小技巧|addslashes绕过
    团队博客七
  • 原文地址:https://www.cnblogs.com/mhc-fly/p/7860777.html
Copyright © 2011-2022 走看看