首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将依赖项注入IClassFixture中的XUnit中?

如何将依赖项注入IClassFixture中的XUnit中?
EN

Stack Overflow用户
提问于 2021-05-16 11:42:07
回答 1查看 1.4K关注 0票数 2

我正在使用XUnit,在运行测试服之前需要执行一些操作。因此,我尝试使用IClassFixture特性的XUnit。但是我找不到一种方法将依赖项注入到治具类中。我的代码结构如下:

代码语言:javascript
复制
public class MyFixture
{
    IDependency _dep;

    public MyFixture(IDependency dep)
    {
        _dep = dep;
    }
    
    void DoSomeJob()
    {
       //// some code there
       dep.DoSome();
    } 
}  

这是我的测试类代码:

代码语言:javascript
复制
public class MyTest : IClassFixture<MyFixture>
{
    [Fact]
    public void test_my_code()
    {
        ////simply just test the code
    }
}

但是当我运行测试时,我得到了异常

Xunit.Sdk.TestClassException类夹具类型'MyFixture‘有一个或多个未解析的构造函数

EN

回答 1

Stack Overflow用户

发布于 2021-10-04 11:38:24

您的夹具类依赖于尚未配置的IDependency dep。您可以使用治具类来设置服务提供者;但是,它不是最好的解决方案,因为您必须使用服务定位器模式,如

代码语言:javascript
复制
serviceProvider.GetRequiredService<T>()

建议使用xunit.di,它是一个内置在xunit框架中的扩展,以支持构造函数依赖注入,使我们能够在测试类和它们的依赖项之间实现控制反转(IoC)。

代码语言:javascript
复制
Install-Package Xunit.Di

使用:xunit.di:

  • 安装xunit.di nuget软件包
  • 创建一个Setup.cs类来配置依赖项(可选)并继承Xunit.Di.Setup.cs
  • 在Setup.cs类中配置依赖项。

xunit.di入门找到完整的说明和演示

您的测试项目有以下内容:

  • 具有公共IServiceProvider的安装类,该类配置所有依赖项。
  • 使用构造函数注入依赖项的测试类。

您的Setup.cs类如下所示:

代码语言:javascript
复制
    private IServiceProvider _services;
    private bool _built = false;
    private readonly IHostBuilder _defaultBuilder;

    public Setup()
    {
        _defaultBuilder = Host.CreateDefaultBuilder();
    }

    public IServiceProvider Services => _services ?? Build();

    private IServiceProvider Build()
    {
        if (_built)
            throw new InvalidOperationException("Build can only be called once.");
        _built = true;

        _defaultBuilder.ConfigureServices((context, services) =>
        {
            services.AddSingleton<TextReaderService>();
            services.AddSingleton<IDependency, DependencyImpl>();
            // where DependencyImpl implements IDependency
            // ... add other services needed
        });

        _services = _defaultBuilder.Build().Services;
        return _services;
    }

然后您的测试类如下所示:

代码语言:javascript
复制
public class MyTest
{
    private readonly IDependency _dependency;

    public MyTest(IDependency dependency)
    {
        _dependency = dependency;
    }

    [Fact]
    public void test_my_code()
    {
        var result = _dependency.DoStuff();
        Assert.NotNull(result);
        ////simply just test the code
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67556254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档