Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Remove the need for `AbstractStartedContainer` wrappers in modules

Đang mở
#1,563 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức phù hợp với người mới
35/100
Loại issue
Tái cấu trúc
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
docker, node.js, typescript
Lĩnh vực
backend, testing

Hướng nghiên cứu

Read the four packages/testcontainers/src/generic-*/ files listed under “Where,” then inspect module start() overrides and started classes under packages/modules/*/src/. First resolve the stated dependencies and coordinate with issues #1521 and #1538; account for Compose and reuse paths that construct StartedGenericContainer. Done means modules can declare their started type without forwarding wrappers or wrapper-only start() overrides, with the listed follow-up work coordinated.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

enhancement major

What happens

Every module is two classes joined by a forwarding wrapper. Simplified from the redis module:

export class RedisContainer extends GenericContainer {
  public override async start(): Promise<StartedRedisContainer> {
    return new StartedRedisContainer(await super.start(), this.password);
  }
}

export class StartedRedisContainer extends AbstractStartedContainer {
  constructor(startedTestContainer: StartedTestContainer, private readonly password?: string) {
    super(startedTestContainer);
  }
}

AbstractStartedContainer holds a StartedTestContainer and forwards each of its 20 methods to it.

  • 50 module classes extend it.
  • 50 module files override start(), and each override has to wrap the result of super.start() in the module's started class.
  • Every method added to StartedTestContainer has to be written three times: on the interface, on StartedGenericContainer and as a forwarder on AbstractStartedContainer.
  • Forwarding has caused bugs: #1202, where Symbol.asyncDispose called the inner stop() and skipped the subclass's.
  • There are two sets of stop hooks: containerStopping/containerStopped on AbstractStartedContainer, and containerIsStopping/containerIsStopped on StartedGenericContainer, which nothing overrides. That class is not exported.
  • AbstractStoppedContainer repeats the pattern and is used once (selenium).
  • Overriding start() to wrap is also where modules put configuration, which is why start() is not repeatable (#1520).

Expected

A module author declares the started type once, with no forwarding class and no start() override just to wrap. Some directions:

  • Make GenericContainer generic over its started type, with a protected factory that the base start() calls. Configuration moves to a hook such as beforeContainerCreated.
  • Export a started base class that module containers extend directly, and let the builder say which class to construct. Inheritance replaces forwarding.
  • One class for both states, as Java and Go have.

Where

  • packages/testcontainers/src/generic-container/abstract-started-container.ts
  • packages/testcontainers/src/generic-container/abstract-stopped-container.ts
  • packages/testcontainers/src/generic-container/started-generic-container.ts
  • every packages/modules/*/src/*-container.ts

Notes

  • Java and Go use a single type for a configured and a running container. .NET splits builder and container like this repo, but the module container extends the base container directly (PostgreSqlContainer : DockerContainer, IDatabaseContainer), with no forwarding layer.
  • Compose and the reuse path construct StartedGenericContainer themselves, so the design has to cover those.
  • Semver: labelled major for removing AbstractStartedContainer. The replacement can ship first in a minor, with the wrapper deprecated.

Dependencies

  • Blocked by #1520, #1554: modules configure themselves inside start() and through protected hooks. Both need their replacement first.
  • Coordinate with #1521: hook semantics for reused containers.
  • Coordinate with #1538: both edit every module's started class.
  • Land after the started-container additions (#1544, #1545, #1546, #1547, #1548, #1549, #1541). They add forwarders that this removes.
Ngôn ngữ chính
TypeScript
Star
2.6k
Fork
274
Merge trung bình
1 ngày 14 giờ
Pull request đã merge (30 ngày)
44

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của testcontainers/testcontainers-node

Tất cả issue của testcontainers/testcontainers-node

Issue tương tự

Thêm issue về TypeScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.