Our great sponsors
-
dockertest
Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work.
-
InfluxDB
Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
-
testcontainers-node
Testcontainers is a NodeJS library that supports tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
-
WorkOS
The modern identity platform for B2B SaaS. The APIs are flexible and easy-to-use, supporting authentication, user identity, and complex enterprise features like SSO and SCIM provisioning.
This one looks cool!, I'll need to take a look to the documentation just to see if it satisfies our needs. I have been using an alternative library that seems to be more stable: https://github.com/ory/dockertest. I like it a lot and it has some good and complete documentation with examples included. Do you have any previous experience with this one or any other benchmark against testcontainers?
In all other layers, my repositories are mocked using https://github.com/golang/mock
I usually use the testify (https://github.com/stretchr/testify) It can help you to mock your external components. For unit tests I see one way and it is not to allow external interaction (DBs, APIs, etc) while tests are going. Keep your project structure like the clean architecture (https://betterprogramming.pub/the-clean-architecture-beginners-guide-e4b7058c1165) and then, as a result, you will have opportunity to replace components and configure their behavior.
Another approach if you want to stay at the DB level is to implement the Io/fs interface (https://pkg.go.dev/io/fs). It is currently only read-only but you can extend it with a write mode in your project (see https://github.com/golang/go/issues/45757).
The docker file I used is basically this one except as I mention I hack out the VOLUME line, which makes it transient.
I have used only testcontainers. I used it for the first time while working with Java, and then with NodeJS. When I came to know that a Golang version is available, I ended up using it since I'm now familiar with the framework irrespective of the language.
I used also other lib to mock different components like redis cache.
Just replaced mockery generated mocks with https://github.com/matryer/moq Alot cleaner imo at least for me