Loading...
Loading...
Generate comprehensive Go unit tests following testify patterns and best practices. Use when creating or updating Go test files, writing test suites for structs with dependencies, testing standalone functions, working with mocks, or when asked to add test coverage for Go code.
npx skill4agent add cristiano-pacheco/ai-tools go-unit-testsTestFunction_ValidInput_ReturnsExpectedResultTestFunction_EmptyInput_ReturnsErrorsuite.SuitesutSetupTestNewTypeName_testsuitesuite.Equal(v, 10)suite.Require()suite.Require().ErrorIssuite.Require().Error.AssertExpectations(s.T())package mypackage_test
import (
"testing"
"github.com/stretchr/testify/suite"
)
type MyStructTestSuite struct {
suite.Suite
sut *mypackage.MyStruct
}
func (s *MyStructTestSuite) SetupTest() {
// Initialize sut and dependencies
s.sut = mypackage.New()
}
func TestMyStructSuite(t *testing.T) {
suite.Run(t, new(MyStructTestSuite))
}
func (s *MyStructTestSuite) TestSomeMethod() {
// Arrange
input := "test input"
expected := "expected output"
// Act
result := s.sut.SomeMethod(input)
// Assert
s.Equal(expected, result)
}
func (s *MyStructTestSuite) TestSomeMethod_WithError() {
// Arrange
invalidInput := ""
// Act
result, err := s.sut.SomeMethodWithError(invalidInput)
// Assert
s.Require().Error(err)
s.Empty(result)
}package mypackage_test
import (
"context"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
"github.com/example/project/test/mocks"
)
type UserServiceTestSuite struct {
suite.Suite
sut *mypackage.UserService
userRepoMock *mocks.MockUserRepository
tokenServiceMock *mocks.MockTokenService
}
func (s *UserServiceTestSuite) SetupTest() {
// Initialize mocks
s.userRepoMock = mocks.NewMockUserRepository(s.T())
s.tokenServiceMock = mocks.NewMockTokenService(s.T())
// Initialize sut with mocked dependencies
s.sut = mypackage.NewUserService(
s.userRepoMock,
s.tokenServiceMock,
)
}
func TestUserServiceSuite(t *testing.T) {
suite.Run(t, new(UserServiceTestSuite))
}
func (s *UserServiceTestSuite) TestCreateUser_ValidInput_CreatesUser() {
// Arrange
ctx := context.Background()
user := &mypackage.User{
Email: "test@example.com",
Name: "Test User",
}
s.userRepoMock.On("Create", mock.Anything, user).Return(nil)
// Act
err := s.sut.CreateUser(ctx, user)
// Assert
s.Require().NoError(err)
}
func (s *UserServiceTestSuite) TestCreateUser_RepositoryError_ReturnsError() {
// Arrange
ctx := context.Background()
user := &mypackage.User{
Email: "test@example.com",
Name: "Test User",
}
expectedError := errors.New("repository error")
s.userRepoMock.On("Create", mock.Anything, user).Return(expectedError)
// Act
err := s.sut.CreateUser(ctx, user)
// Assert
s.Require().ErrorIs(err, expectedError)
}
func (s *UserServiceTestSuite) TestGenerateToken_ValidUser_ReturnsToken() {
// Arrange
ctx := context.Background()
userID := "user-123"
expectedToken := "token-abc"
s.tokenServiceMock.On(
"Generate",
mock.Anything,
userID,
).Return(expectedToken, nil)
// Act
token, err := s.sut.GenerateToken(ctx, userID)
// Assert
s.Require().NoError(err)
s.Equal(expectedToken, token)
}mock.AnythingMockTypeMockUserRepositoryMockTokenServiceuser_repository_mocks "github.com/project/internal/domain/repository/mocks"func TestXxx(t *testing.T)t.Runrequirerequire.ErrorIsrequire.Errorpackage mypackage_test
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestSomeFunction(t *testing.T) {
t.Run("valid input returns expected result", func(t *testing.T) {
// Arrange
input := "test input"
expected := "expected output"
// Act
result := SomeFunction(input)
// Assert
require.Equal(t, expected, result)
})
t.Run("empty input returns error", func(t *testing.T) {
// Arrange
input := ""
// Act
result, err := SomeFunctionWithError(input)
// Assert
require.Error(t, err)
require.Empty(t, result)
})
t.Run("nil input returns error", func(t *testing.T) {
// Arrange
var input *string
// Act
result, err := SomeFunctionWithPointer(input)
// Assert
require.ErrorIs(t, err, ErrNilInput)
require.Empty(t, result)
})
}// Arrange
// Act
// Assert