Appearance
Fresh
Write tests
Back
Getting started with Testcontainers for Node.js
Learn how to create a Node.js application and test database interactions using Testcontainers for Node.js with a real PostgreSQL instance.
JavaScript Testing with Docker
15 minutes
Write tests with Testcontainers
Copy as Markdown
Open MarkdownAsk Docs AIClaudeOpen in Claude
Create src/customer-repository.test.js with the test:
javascript
const { Client } = require("pg");
const { PostgreSqlContainer } = require("@testcontainers/postgresql");
const {
createCustomerTable,
createCustomer,
getCustomers,
} = require("./customer-repository");
describe("Customer Repository", () => {
jest.setTimeout(60000);
let postgresContainer;
let postgresClient;
beforeAll(async () => {
postgresContainer = await new PostgreSqlContainer().start();
postgresClient = new Client({
connectionString: postgresContainer.getConnectionUri(),
});
await postgresClient.connect();
await createCustomerTable(postgresClient);
});
afterAll(async () => {
await postgresClient.end();
await postgresContainer.stop();
});
it("should create and return multiple customers", async () => {
const customer1 = { id: 1, name: "John Doe" };
const customer2 = { id: 2, name: "Jane Doe" };
await createCustomer(postgresClient, customer1);
await createCustomer(postgresClient, customer2);
const customers = await getCustomers(postgresClient);
expect(customers).toEqual([customer1, customer2]);
});
});Here's what the test does:
- The
beforeAllblock starts a real PostgreSQL container usingPostgreSqlContainer. It then creates apgclient connected to the container and sets up thecustomerstable. - The
afterAllblock closes the client connection and stops the container. - The test inserts two customers, fetches all customers, and asserts the results match.
The test timeout is set to 60 seconds to allow time for the container to start on the first run (when the Docker image needs to be pulled).