stretchr / testify

A toolkit with common assertions and mocks that plays nicely with the standard library
MIT License
22.57k stars 1.57k forks source link

Add PanicAssertionFunc #730

Closed palsivertsen closed 4 months ago

palsivertsen commented 5 years ago

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

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
devdinu commented 5 years ago

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.

palsivertsen commented 5 years ago

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
fahimbagar commented 1 year ago

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