diff --git a/suite/suite.go b/suite/suite.go index f3aa9a16b..a9698d1dd 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -184,6 +184,11 @@ func Run(t *testing.T, suite TestingSuite) { failOnPanic(t, r) }() + if method.Type.NumIn() > 1 || method.Type.NumOut() > 0 { + msg := fmt.Sprintf("testify: suite method '%s' shouldn't have any arguments or returning values", method.Name) + panic(msg) + } + if setupTestSuite, ok := suite.(SetupTestSuite); ok { setupTestSuite.SetupTest() } diff --git a/suite/suite_test.go b/suite/suite_test.go index 292dc298c..f31226dcf 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -402,6 +402,56 @@ func TestSkippingSuiteSetup(t *testing.T) { assert.False(t, suiteTester.toreDown) } +// This suite has no Test... methods. It's setup and teardown must be skipped. +type SuiteInvalidTestSignatureTester struct { + Suite + + executedTestCount int + + setUp bool + toreDown bool +} + +func (s *SuiteInvalidTestSignatureTester) SetupSuite() { + s.setUp = true +} + +func (s *SuiteInvalidTestSignatureTester) TestInvalidSignatureReturnValue() interface{} { + s.executedTestCount++ + return nil +} + +func (s *SuiteInvalidTestSignatureTester) TestInvalidSignatureArg(somearg string) { + s.executedTestCount++ +} + +func (s *SuiteInvalidTestSignatureTester) TestInvalidSignatureBoth(somearg string) interface{} { + s.executedTestCount++ + return nil +} + +func (s *SuiteInvalidTestSignatureTester) TearDownSuite() { + s.toreDown = true +} + +func TestSuiteInvalidTestSignature(t *testing.T) { + suiteTester := new(SuiteInvalidTestSignatureTester) + + ok := testing.RunTests(allTestsFilter, []testing.InternalTest{ + { + Name: "invalid signature", + F: func(t *testing.T) { + Run(t, suiteTester) + }, + }, + }) + + require.False(t, ok) + assert.Zero(t, suiteTester.executedTestCount) + assert.True(t, suiteTester.setUp) + assert.True(t, suiteTester.toreDown) +} + func TestSuiteGetters(t *testing.T) { suite := new(SuiteTester) suite.SetT(t)