使用DotNet Testcontainers启动MailDev容器时抛出'Sequence contains more than one element'异常的排查求助
DotNet Testcontainers启动MailDev容器时抛出'Sequence contains more than one element'异常的排查求助
大家好,我最近在给公司的[MYAPP]项目编写UI自动化测试,需要用DotNet Testcontainers启动一个MailDev容器,用来拦截用户登录/密码重置场景下的发送邮件。但运行测试时一直卡在容器启动阶段,抛出了Sequence contains more than one element的异常,折腾了好一阵都没搞定,来向各位大佬求助!
错误日志详情
Error Log: Standard Output Messages: [testcontainers.org 00:00:03.98] Reuse is an experimental feature. warning: The previous ScenarioContext was already disposed. Failed EmailAddressesAreValidatedByTheForgottenPasswordScreen("it uses unquoted backslashes",null) [26 ms] Error Message: System.InvalidOperationException : Sequence contains more than one element TearDown : System.NullReferenceException : Object reference not set to an instance of an object. Stack Trace: at System.Linq.ThrowHelper.ThrowMoreThanOneElementException() at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Boolean& found) at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) at DotNet.Testcontainers.Containers.DockerContainer.UnsafeCreateAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 441 at DotNet.Testcontainers.Containers.DockerContainer.StartAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 306 at [MYCOMPANY].[MYAPP].UI.Tests.Hooks.ConfigurationHooks.SetConfiguration(IObjectContainer objectContainer) in /home/runner/actions-runner/_work/[MYAPP]/[MYAPP]/Tests/[MYCOMPANY].[MYAPP].UI.Tests/Hooks/ConfigurationHooks.cs:line 48 ...(后续调用栈省略)
从栈信息看,异常是在DockerContainer.UnsafeCreateAsync方法里调用SingleOrDefault时触发的——因为查询到的序列存在多个元素,不符合该方法的预期。
我的容器创建代码
这是我在ConfigurationHooks里创建MailDev容器的核心代码片段:
[BeforeFeature(Order = TestRunSequence.RegisterObjectContainer)] public static async Task SetConfiguration(IObjectContainer objectContainer) { var configuration = new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables() // 加载环境变量 .AddUserSecrets<IdentityProviderConfiguration>() .Build(); objectContainer?.RegisterInstanceAs(configuration); var mailDevContainer= new ContainerBuilder() .WithImage("maildev/maildev:latest") .WithPortBinding(1080, true) .WithPortBinding(1025, true) .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(1080)) .WithReuse(true) .WithLabel("maildev-container", "MailDev") .WithPortBinding(1080, 1080) .WithPortBinding(1025, 1025) .Build(); // 后续启动容器的逻辑... }
我的疑惑点
- 我注意到代码里重复调用了
WithPortBinding:先是WithPortBinding(1080, true)和WithPortBinding(1025, true),后来又加了WithPortBinding(1080, 1080)和WithPortBinding(1025, 1025),会不会是重复绑定端口导致Testcontainers查询容器时出现多个匹配项? - 我开启了容器复用功能(
WithReuse(true)),这个特性是实验性的,会不会是复用逻辑在查找现有容器时返回了多个结果,导致SingleOrDefault调用失败? - 有没有可能是Docker环境本身的问题,比如之前的MailDev容器没有正确清理,导致存在多个同标签/同端口的容器?
有没有遇到过类似问题的朋友?或者能帮我排查下代码里的问题,给个解决方向?
内容来源于stack exchange
相关产品推荐
相关产品推荐

