代码之家  ›  专栏  ›  技术社区  ›  Coden00b

将可选参数传递给xunit中的类夹具构造函数

  •  1
  • Coden00b  · 技术社区  · 8 月前

    我有使用现有夹具的测试,我想添加新的测试,将参数传递给夹具进行配置。我想使用可选参数来避免破坏现有的测试。不幸的是。。。

    未使用参数指定夹具的测试会出现以下错误: 类夹具类型“ContextFixture”有一个或多个未解析的构造函数参数:字符串选项

    public class ContextFixture : IDisposable
    {
        public ContextFixture(string? options = default) {...}
    }
    public class SandboxContextFixture : ContextFixture, IDisposable
    {
        public SandboxContextFixture() : base(options) {...}
    }
    public class ServiceTests : IClassFixture<ContextFixture>
    {
        public ServiceTests(ContextFixture contextFixture) {...}
    }
    public class RepositoryTests : IClassFixture<SandboxContextFixture>
    {
        public RepositoryTests(SandboxContextFixture fixture) {...}
    }
    
    1 回复  |  直到 8 月前
        1
  •  1
  •   pfx    8 月前

    xUnit对夹具类的公共构造函数中可以接受哪种类型的参数有一些严格的规则;一 IMessageSink ITestContextAccessor 。参见 source code on GitHub 请注意,引发了异常 here 因为 string 不支持代码中的选项。

    要解决此问题,请保持默认值/无参数 public 建设者在那 ContextFixture 类允许在没有参数的情况下实例化它。

    添加a protected 带有参数的构造函数 ConstextFixture 并让衍生 SandboxContextFixture fixture类从其默认/无参数构造函数中调用该类。

    public class ContextFixture
    {
        public ContextFixture()
        { }
    
        protected ContextFixture(string? options)
        { }
    }
    
    public class SandboxContextFixture : ContextFixture
    {
        public SandboxContextFixture() : base("some options value")
        { }
    }
    

    可选地,在 ContextFixture 类,无参数构造函数可以调用有参数的构造函数。

    public class ContextFixture
    {
        public ContextFixture() : this(default)
        { }
    
        protected ContextFixture(string? options)
        {
            // ... 
        }
    }