Add panic stack to output from NotPanics assertion failures

pull/825/head
Daniel Cormier 2018-07-16 10:42:29 -04:00 committed by George Lesica
parent 221dbe5ed4
commit 85f2b59c44
3 changed files with 14 additions and 11 deletions

View File

@ -11,6 +11,7 @@ import (
"reflect" "reflect"
"regexp" "regexp"
"runtime" "runtime"
"runtime/debug"
"strings" "strings"
"time" "time"
"unicode" "unicode"
@ -901,15 +902,17 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
type PanicTestFunc func() type PanicTestFunc func()
// didPanic returns true if the function passed to it panics. Otherwise, it returns false. // didPanic returns true if the function passed to it panics. Otherwise, it returns false.
func didPanic(f PanicTestFunc) (bool, interface{}) { func didPanic(f PanicTestFunc) (bool, interface{}, string) {
didPanic := false didPanic := false
var message interface{} var message interface{}
var stack string
func() { func() {
defer func() { defer func() {
if message = recover(); message != nil { if message = recover(); message != nil {
didPanic = true didPanic = true
stack = string(debug.Stack())
} }
}() }()
@ -918,7 +921,7 @@ func didPanic(f PanicTestFunc) (bool, interface{}) {
}() }()
return didPanic, message return didPanic, message, stack
} }
@ -930,7 +933,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
h.Helper() h.Helper()
} }
if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic {
return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...)
} }
@ -946,12 +949,12 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr
h.Helper() h.Helper()
} }
funcDidPanic, panicValue := didPanic(f) funcDidPanic, panicValue, panickedStack := didPanic(f)
if !funcDidPanic { if !funcDidPanic {
return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...)
} }
if panicValue != expected { if panicValue != expected {
return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v", f, expected, panicValue), msgAndArgs...) return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...)
} }
return true return true
@ -965,8 +968,8 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
h.Helper() h.Helper()
} }
if funcDidPanic, panicValue := didPanic(f); funcDidPanic { if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic {
return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v", f, panicValue), msgAndArgs...) return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...)
} }
return true return true

View File

@ -730,13 +730,13 @@ func TestCondition(t *testing.T) {
func TestDidPanic(t *testing.T) { func TestDidPanic(t *testing.T) {
if funcDidPanic, _ := didPanic(func() { if funcDidPanic, _, _ := didPanic(func() {
panic("Panic!") panic("Panic!")
}); !funcDidPanic { }); !funcDidPanic {
t.Error("didPanic should return true") t.Error("didPanic should return true")
} }
if funcDidPanic, _ := didPanic(func() { if funcDidPanic, _, _ := didPanic(func() {
}); funcDidPanic { }); funcDidPanic {
t.Error("didPanic should return false") t.Error("didPanic should return false")
} }

View File

@ -212,13 +212,13 @@ func TestConditionWrapper(t *testing.T) {
func TestDidPanicWrapper(t *testing.T) { func TestDidPanicWrapper(t *testing.T) {
if funcDidPanic, _ := didPanic(func() { if funcDidPanic, _, _ := didPanic(func() {
panic("Panic!") panic("Panic!")
}); !funcDidPanic { }); !funcDidPanic {
t.Error("didPanic should return true") t.Error("didPanic should return true")
} }
if funcDidPanic, _ := didPanic(func() { if funcDidPanic, _, _ := didPanic(func() {
}); funcDidPanic { }); funcDidPanic {
t.Error("didPanic should return false") t.Error("didPanic should return false")
} }