From 2b7ec8b65082283ba9400a048f5b97d28c6ae25d Mon Sep 17 00:00:00 2001 From: digital88 Date: Sat, 13 Dec 2025 22:40:26 +0300 Subject: [PATCH 1/3] update missing builders with image pin --- .../EventHubsBuilder.cs | 2 +- .../ServiceBusBuilder.cs | 2 +- src/Testcontainers/Containers/SocatBuilder.cs | 34 +++++++++++++++++++ .../EventHubsContainerTest.cs | 2 +- .../ConnectionStringProviderTest.cs | 6 ++-- .../SocatContainerTest.cs | 2 +- .../DeclineLicenseAgreementTest.cs | 4 +-- .../ServiceBusContainerTest.cs | 2 +- .../Fixtures/Containers/Unix/DockerMTls.cs | 3 +- .../Containers/Unix/DockerTlsFixture.cs | 5 +-- .../Unix/ProtectDockerDaemonSocket.cs | 3 +- .../Unix/TestcontainersContainerTest.cs | 11 +++--- .../ToxiproxyContainerTest.cs | 2 +- 13 files changed, 56 insertions(+), 22 deletions(-) diff --git a/src/Testcontainers.EventHubs/EventHubsBuilder.cs b/src/Testcontainers.EventHubs/EventHubsBuilder.cs index 68e9fbb52..4f4f31b97 100644 --- a/src/Testcontainers.EventHubs/EventHubsBuilder.cs +++ b/src/Testcontainers.EventHubs/EventHubsBuilder.cs @@ -142,7 +142,7 @@ public override EventHubsContainer Build() var network = new NetworkBuilder() .Build(); - var container = new AzuriteBuilder() + var container = new AzuriteBuilder("mcr.microsoft.com/azure-storage/azurite:3.28.0") .WithNetwork(network) .WithNetworkAliases(AzuriteNetworkAlias) .Build(); diff --git a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs index 0fe570be4..bb06f6e45 100644 --- a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs +++ b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs @@ -147,7 +147,7 @@ public override ServiceBusContainer Build() var network = new NetworkBuilder() .Build(); - var container = new MsSqlBuilder() + var container = new MsSqlBuilder("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") .WithNetwork(network) .WithNetworkAliases(DatabaseNetworkAlias) .Build(); diff --git a/src/Testcontainers/Containers/SocatBuilder.cs b/src/Testcontainers/Containers/SocatBuilder.cs index 91598223f..d1964b19d 100644 --- a/src/Testcontainers/Containers/SocatBuilder.cs +++ b/src/Testcontainers/Containers/SocatBuilder.cs @@ -6,23 +6,57 @@ namespace DotNet.Testcontainers.Containers using Docker.DotNet.Models; using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Configurations; + using DotNet.Testcontainers.Images; using JetBrains.Annotations; /// [PublicAPI] public sealed class SocatBuilder : ContainerBuilder { + [Obsolete("This constant is obsolete and will be removed in the future. Use the constructor with the image parameter instead: https://github.com/testcontainers/testcontainers-dotnet/discussions/1470#discussioncomment-15185721.")] public const string SocatImage = "alpine/socat:1.7.4.3-r0"; /// /// Initializes a new instance of the class. /// + [Obsolete("This parameterless constructor is obsolete and will be removed. Use the constructor with the image parameter instead: https://github.com/testcontainers/testcontainers-dotnet/discussions/1470#discussioncomment-15185721.")] public SocatBuilder() : this(new SocatConfiguration()) { DockerResourceConfiguration = Init().DockerResourceConfiguration; } + /// + /// Initializes a new instance of the class. + /// + /// + /// The full Docker image name, including the image repository and tag + /// (e.g., alpine/socat:1.7.4.3-r0). + /// + /// + /// Docker image tags available at . + /// + public SocatBuilder(string image) + : this(new DockerImage(image)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// An instance that specifies the Docker image to be used + /// for the container builder configuration. + /// + /// + /// Docker image tags available at . + /// + public SocatBuilder(IImage image) + : this(new SocatConfiguration()) + { + DockerResourceConfiguration = Init().WithImage(image).DockerResourceConfiguration; + } + /// /// Initializes a new instance of the class. /// diff --git a/tests/Testcontainers.EventHubs.Tests/EventHubsContainerTest.cs b/tests/Testcontainers.EventHubs.Tests/EventHubsContainerTest.cs index 92a3eac79..e79db35c2 100644 --- a/tests/Testcontainers.EventHubs.Tests/EventHubsContainerTest.cs +++ b/tests/Testcontainers.EventHubs.Tests/EventHubsContainerTest.cs @@ -108,7 +108,7 @@ public DatabaseFixture() Network = new NetworkBuilder() .Build(); - Container = new AzuriteBuilder() + Container = new AzuriteBuilder("mcr.microsoft.com/azure-storage/azurite:3.28.0") .WithNetwork(Network) .WithNetworkAliases(AzuriteNetworkAlias) .Build(); diff --git a/tests/Testcontainers.Platform.Linux.Tests/ConnectionStringProviderTest.cs b/tests/Testcontainers.Platform.Linux.Tests/ConnectionStringProviderTest.cs index c863e8387..2350bd463 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/ConnectionStringProviderTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/ConnectionStringProviderTest.cs @@ -12,8 +12,7 @@ public sealed class Configured : IAsyncLifetime public Configured() { - _container = new ContainerBuilder() - .WithImage(CommonImages.Alpine) + _container = new ContainerBuilder(CommonImages.Alpine) .WithCommand(CommonCommands.SleepInfinity) .WithConnectionStringProvider(_connectionStringProvider) .Build(); @@ -42,8 +41,7 @@ public void GetConnectionStringReturnsExpectedValue() public sealed class NotConfigured : IAsyncLifetime { - private readonly IContainer _container = new ContainerBuilder() - .WithImage(CommonImages.Alpine) + private readonly IContainer _container = new ContainerBuilder(CommonImages.Alpine) .WithCommand(CommonCommands.SleepInfinity) .Build(); diff --git a/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs b/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs index 083d5c926..9f498e703 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs @@ -20,7 +20,7 @@ public SocatContainerTest() .WithNetworkAliases(HelloWorldAlias) .Build(); - _socatContainer = new SocatBuilder() + _socatContainer = new SocatBuilder("alpine/socat:1.7.4.3-r0") .WithNetwork(_network) .WithTarget(8080, HelloWorldAlias) .WithTarget(8081, HelloWorldAlias, 8080) diff --git a/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs b/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs index 523dac1dc..6dfe10b3b 100644 --- a/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs @@ -9,7 +9,7 @@ public sealed partial class DeclineLicenseAgreementTest [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public void WithoutAcceptingLicenseAgreementThrowsArgumentException() { - var exception = Assert.Throws(() => new ServiceBusBuilder().Build()); + var exception = Assert.Throws(() => new ServiceBusBuilder("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest").Build()); Assert.Matches(LicenseAgreementNotAccepted(), exception.Message); } @@ -17,7 +17,7 @@ public void WithoutAcceptingLicenseAgreementThrowsArgumentException() [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public void WithLicenseAgreementDeclinedThrowsArgumentException() { - var exception = Assert.Throws(() => new ServiceBusBuilder().WithAcceptLicenseAgreement(false).Build()); + var exception = Assert.Throws(() => new ServiceBusBuilder("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest").WithAcceptLicenseAgreement(false).Build()); Assert.Matches(LicenseAgreementNotAccepted(), exception.Message); } } \ No newline at end of file diff --git a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs index 40e341cf5..425428201 100644 --- a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs @@ -116,7 +116,7 @@ public DatabaseFixture() Network = new NetworkBuilder() .Build(); - Container = new MsSqlBuilder() + Container = new MsSqlBuilder("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") .WithNetwork(Network) .WithNetworkAliases(DatabaseNetworkAlias) .Build(); diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs index 84265df0f..9c14c9ac9 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs @@ -2,11 +2,12 @@ namespace DotNet.Testcontainers.Tests.Fixtures { using System.Collections.Generic; using DotNet.Testcontainers.Builders; + using DotNet.Testcontainers.Images; public abstract class DockerMTls : ProtectDockerDaemonSocket { public DockerMTls(string dockerImageVersion) - : base(new ContainerBuilder(), dockerImageVersion) + : base(new ContainerBuilder(new DockerImage("docker", null, dockerImageVersion + "-dind"))) { } diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs index 810872503..79e891be3 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs @@ -2,14 +2,15 @@ namespace DotNet.Testcontainers.Tests.Fixtures { using System.Collections.Generic; using DotNet.Testcontainers.Builders; + using DotNet.Testcontainers.Images; using JetBrains.Annotations; [UsedImplicitly] public sealed class DockerTlsFixture : ProtectDockerDaemonSocket { public DockerTlsFixture() - : base(new ContainerBuilder() - .WithCommand("--tlsverify=false"), "29.0.0") + : base(new ContainerBuilder(new DockerImage("docker", null, "29.0.0-dind")) + .WithCommand("--tlsverify=false")) { } diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs index a07dc124d..2b1fcbc8b 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs @@ -23,10 +23,9 @@ public abstract class ProtectDockerDaemonSocket : IAsyncLifetime private readonly IContainer _container; - protected ProtectDockerDaemonSocket(ContainerBuilder containerConfiguration, string dockerImageVersion) + protected ProtectDockerDaemonSocket(ContainerBuilder containerConfiguration) { _container = containerConfiguration - .WithImage(new DockerImage("docker", null, dockerImageVersion + "-dind")) .WithPrivileged(true) .WithPortBinding(TlsPort, true) .WithBindMount(_hostCertsDirectoryPath, _containerCertsDirectoryPath, AccessMode.ReadWrite) diff --git a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs index a1208ae59..aeb6bbe68 100644 --- a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs +++ b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs @@ -18,11 +18,12 @@ public static class TestcontainersContainerTest { public sealed class WithConfiguration { - [Fact] - public void ShouldThrowArgumentNullExceptionWhenBuildConfigurationHasNoImage() - { - Assert.Throws(() => _ = new ContainerBuilder().Build()); - } + // This test will always pass, because we always set Image inside builder constructor. + // [Fact] + // public void ShouldThrowArgumentNullExceptionWhenBuildConfigurationHasNoImage() + // { + // Assert.Throws(() => _ = new ContainerBuilder(CommonImages.Alpine).Build()); + // } [Fact] public async Task GeneratedContainerName() diff --git a/tests/Testcontainers.Toxiproxy.Tests/ToxiproxyContainerTest.cs b/tests/Testcontainers.Toxiproxy.Tests/ToxiproxyContainerTest.cs index 69b750acf..a1821d650 100644 --- a/tests/Testcontainers.Toxiproxy.Tests/ToxiproxyContainerTest.cs +++ b/tests/Testcontainers.Toxiproxy.Tests/ToxiproxyContainerTest.cs @@ -13,7 +13,7 @@ public sealed class ToxiproxyContainerTest : IAsyncLifetime public ToxiproxyContainerTest() { - _redisContainer = new RedisBuilder() + _redisContainer = new RedisBuilder("redis:7.0") .WithNetwork(_network) .WithNetworkAliases(RedisNetworkAlias) .Build(); From 85b30c631c111e131fae5b142673b81c875d998f Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sun, 14 Dec 2025 14:48:16 +0100 Subject: [PATCH 2/3] chore: Recuse existing images (CommonImages, GetImageFromDockerfile) --- src/Testcontainers/Containers/SocatBuilder.cs | 7 +++---- .../SocatContainerTest.cs | 2 +- .../DeclineLicenseAgreementTest.cs | 4 ++-- .../Fixtures/Containers/Unix/DockerMTls.cs | 2 +- .../Fixtures/Containers/Unix/DockerTlsFixture.cs | 2 +- .../Containers/Unix/TestcontainersContainerTest.cs | 13 +++++++------ 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Testcontainers/Containers/SocatBuilder.cs b/src/Testcontainers/Containers/SocatBuilder.cs index d1964b19d..25e750e1a 100644 --- a/src/Testcontainers/Containers/SocatBuilder.cs +++ b/src/Testcontainers/Containers/SocatBuilder.cs @@ -14,16 +14,15 @@ namespace DotNet.Testcontainers.Containers public sealed class SocatBuilder : ContainerBuilder { [Obsolete("This constant is obsolete and will be removed in the future. Use the constructor with the image parameter instead: https://github.com/testcontainers/testcontainers-dotnet/discussions/1470#discussioncomment-15185721.")] - public const string SocatImage = "alpine/socat:1.7.4.3-r0"; + public const string SocatImage = "alpine/socat:1.7.4.4"; /// /// Initializes a new instance of the class. /// [Obsolete("This parameterless constructor is obsolete and will be removed. Use the constructor with the image parameter instead: https://github.com/testcontainers/testcontainers-dotnet/discussions/1470#discussioncomment-15185721.")] public SocatBuilder() - : this(new SocatConfiguration()) + : this(SocatImage) { - DockerResourceConfiguration = Init().DockerResourceConfiguration; } /// @@ -31,7 +30,7 @@ public SocatBuilder() /// /// /// The full Docker image name, including the image repository and tag - /// (e.g., alpine/socat:1.7.4.3-r0). + /// (e.g., alpine/socat:1.7.4.4). /// /// /// Docker image tags available at . diff --git a/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs b/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs index 9f498e703..0e3629024 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/SocatContainerTest.cs @@ -20,7 +20,7 @@ public SocatContainerTest() .WithNetworkAliases(HelloWorldAlias) .Build(); - _socatContainer = new SocatBuilder("alpine/socat:1.7.4.3-r0") + _socatContainer = new SocatBuilder(CommonImages.Socat) .WithNetwork(_network) .WithTarget(8080, HelloWorldAlias) .WithTarget(8081, HelloWorldAlias, 8080) diff --git a/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs b/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs index 6dfe10b3b..54b215313 100644 --- a/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/DeclineLicenseAgreementTest.cs @@ -9,7 +9,7 @@ public sealed partial class DeclineLicenseAgreementTest [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public void WithoutAcceptingLicenseAgreementThrowsArgumentException() { - var exception = Assert.Throws(() => new ServiceBusBuilder("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest").Build()); + var exception = Assert.Throws(() => new ServiceBusBuilder(TestSession.GetImageFromDockerfile()).Build()); Assert.Matches(LicenseAgreementNotAccepted(), exception.Message); } @@ -17,7 +17,7 @@ public void WithoutAcceptingLicenseAgreementThrowsArgumentException() [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public void WithLicenseAgreementDeclinedThrowsArgumentException() { - var exception = Assert.Throws(() => new ServiceBusBuilder("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest").WithAcceptLicenseAgreement(false).Build()); + var exception = Assert.Throws(() => new ServiceBusBuilder(TestSession.GetImageFromDockerfile()).WithAcceptLicenseAgreement(false).Build()); Assert.Matches(LicenseAgreementNotAccepted(), exception.Message); } } \ No newline at end of file diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs index 9c14c9ac9..8921710df 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerMTls.cs @@ -7,7 +7,7 @@ namespace DotNet.Testcontainers.Tests.Fixtures public abstract class DockerMTls : ProtectDockerDaemonSocket { public DockerMTls(string dockerImageVersion) - : base(new ContainerBuilder(new DockerImage("docker", null, dockerImageVersion + "-dind"))) + : base(new ContainerBuilder("docker:" + dockerImageVersion + "-dind")) { } diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs index 79e891be3..aee4d2981 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/DockerTlsFixture.cs @@ -9,7 +9,7 @@ namespace DotNet.Testcontainers.Tests.Fixtures public sealed class DockerTlsFixture : ProtectDockerDaemonSocket { public DockerTlsFixture() - : base(new ContainerBuilder(new DockerImage("docker", null, "29.0.0-dind")) + : base(new ContainerBuilder("docker:29.0.0-dind") .WithCommand("--tlsverify=false")) { } diff --git a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs index aeb6bbe68..ebbe5286a 100644 --- a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs +++ b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs @@ -18,12 +18,13 @@ public static class TestcontainersContainerTest { public sealed class WithConfiguration { - // This test will always pass, because we always set Image inside builder constructor. - // [Fact] - // public void ShouldThrowArgumentNullExceptionWhenBuildConfigurationHasNoImage() - // { - // Assert.Throws(() => _ = new ContainerBuilder(CommonImages.Alpine).Build()); - // } + [Theory] + [InlineData(null)] + [InlineData("")] + public void ShouldThrowArgumentNullExceptionWhenContainerBuilderHasNoImage(string image) + { + Assert.Throws(() => _ = new ContainerBuilder(image)); + } [Fact] public async Task GeneratedContainerName() From 68cf527963cc639f1e3aabf5a0ded21b5235871c Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:06:03 +0100 Subject: [PATCH 3/3] chore: Apply code review suggestions --- .../Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs | 4 ++-- .../Unit/Containers/Unix/TestcontainersContainerTest.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs index 2b1fcbc8b..edb9f3154 100644 --- a/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs +++ b/tests/Testcontainers.Tests/Fixtures/Containers/Unix/ProtectDockerDaemonSocket.cs @@ -23,9 +23,9 @@ public abstract class ProtectDockerDaemonSocket : IAsyncLifetime private readonly IContainer _container; - protected ProtectDockerDaemonSocket(ContainerBuilder containerConfiguration) + protected ProtectDockerDaemonSocket(ContainerBuilder containerBuilder) { - _container = containerConfiguration + _container = containerBuilder .WithPrivileged(true) .WithPortBinding(TlsPort, true) .WithBindMount(_hostCertsDirectoryPath, _containerCertsDirectoryPath, AccessMode.ReadWrite) diff --git a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs index ebbe5286a..211bb4718 100644 --- a/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs +++ b/tests/Testcontainers.Tests/Unit/Containers/Unix/TestcontainersContainerTest.cs @@ -21,7 +21,7 @@ public sealed class WithConfiguration [Theory] [InlineData(null)] [InlineData("")] - public void ShouldThrowArgumentNullExceptionWhenContainerBuilderHasNoImage(string image) + public void ShouldThrowArgumentExceptionWhenContainerBuilderHasNoImage(string image) { Assert.Throws(() => _ = new ContainerBuilder(image)); }