mirror of https://github.com/stretchr/testify.git
Add panic stack to output from NotPanics assertion failures
parent
221dbe5ed4
commit
85f2b59c44
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue