主要和测试从恐慌中恢复的区别?

时间:2016-08-18 21:47:01

标签: testing go error-handling

我有以下片段从索引超出范围的恐慌中恢复

Playground,也粘贴在

下面

当从main调用时,错误为nil,而在等效测试用例中则为nil。有什么区别?

type Foo struct {
    Is []int
}

func main() {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        fmt.Errorf("Error: %v", err)
    } 
    fmt.Println("ok")
}

func (fp *Foo) Panic() (err error) {
    defer PanicRecovery(&err)
    fp.Is[0] = 5
    return nil
}

func PanicRecovery(err *error) {

        if r := recover(); r != nil {
                if _, ok := r.(runtime.Error); ok {
            //fmt.Println("Panicing")
                    *err = r.(error) //panic(r)
                } else {
            *err = r.(error)
        }
    }
}

测试用例:

func TestPanic(t *testing.T) {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        t.Errorf("Panic: %v", err)
    }
}

1 个答案:

答案 0 :(得分:1)

更改主函数的嵌套行:

fmt.Errorf("Error: %v", err)

要:

fmt.Printf("Error: %v", err)

请注意"Errorf"函数不会向stdout打印任何内容。它通过格式化您提供的文本和参数来创建错误,并简单地返回该错误。你真正想要的是"fmt.Printf"