testify icon indicating copy to clipboard operation
testify copied to clipboard

Add PanicAssertionFunc

Open palsivertsen opened this issue 6 years ago • 3 comments

There's already common function types for the following assertion groups:

  • assert.BoolAssertionFunc
  • assert.ComparisonAssertionFunc
  • assert.ErrorAssertionFunc
  • assert.ValueAssertionFunc

These are very useful for doing table driven tests, but seems like there's no PanicAssertionFunc. It could look like this:

type PanicAssertionFunc func(t assert.TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool

palsivertsen avatar Feb 18 '19 14:02 palsivertsen

There's a function to test whether given function panics.

func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool

This could be of your interest https://godoc.org/github.com/stretchr/testify/assert#Panics.

devdinu avatar Mar 13 '19 08:03 devdinu

Yes, that's one of the functions that will match the PanicAssertionFunc signature. If you look at the examples for BoolAssertionFunc, ComparisonAssertionFunc, ErrorAssertionFunc and ValueAssertionFunc, I was hoping to do something similar with Panics and NotPanics like so:

package main

import "github.com/stretchr/testify/assert"
import "testing"

// This is the type I suggest adding to testify
type PanicAssertionFunc func(t assert.TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool

// This is an example of PanicAssertionFunc usage with table driven tests
func TestSomebodyPanic(t *testing.T) { 
  tests := map[string]struct { 
    f         func()
    assertion PanicAssertionFunc
  }{
    "panics":        {IPanic, assert.Panics},
    "no panic":      {ImOK, assert.NotPanics},
    "fail panic":    {IPanic, assert.NotPanics},
    "fail no panic": {ImOK, assert.Panics},
  } 
  for name, tt := range tests { 
    tt := tt
    t.Run(name, func(t *testing.T) { 
      tt.assertion(t, tt.f)
    })
  } 
}

// Helper functions

// IPanic always panics with a nil value
func IPanic() { 
  panic(nil)
}

// ImOK does nothing
func ImOK() {}

The above test will give the following output:

$ go test
--- FAIL: TestSomebodyPanic (0.00s)
    --- FAIL: TestSomebodyPanic/fail_no_panic (0.00s)
        main_test.go:23: 
            	Error Trace:	main_test.go:23
            	Error:      	func (assert.PanicTestFunc)(0x678310) should panic
            	            		Panic value:	<nil>
            	Test:       	TestSomebodyPanic/fail_no_panic
    --- FAIL: TestSomebodyPanic/panics (0.00s)
        main_test.go:23: 
            	Error Trace:	main_test.go:23
            	Error:      	func (assert.PanicTestFunc)(0x6782d0) should panic
            	            		Panic value:	<nil>
            	Test:       	TestSomebodyPanic/panics
FAIL
exit status 1
FAIL	test	0.003s

palsivertsen avatar Mar 19 '19 14:03 palsivertsen

Since I find a similar concern, I have added PR https://github.com/stretchr/testify/pull/1337

fahimbagar avatar Feb 01 '23 15:02 fahimbagar