尝试通过 XUnit 使用依赖项注入时出现未解析的构造函数参数错误

Bla*_*ell 8 c# xunit xunit.net asp.net-core

我的每个 XUnit 测试项目都有一个 appsettings.json 文件,该文件指定了一些设置。我一直使用 IConfiguration 的依赖注入来检索我的 Test Fixture 类中的这些设置。现在想起来,我完全不知道 IConfiguration 过去是如何解决的,因为 XUnit 项目中没有 Startup.cs 和 ConfigureServices 方法。但我发誓它有效。

以下内容曾经有效,但现在不起作用:

夹具:

public class TestFixture : IDisposable
{
    public IConfiguration Configuration { get; set; }

    public TestFixture(IConfiguration configuration)
    {
        Configuration = configuration;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类:

public class TestCases : IClassFixture<TestFixture>
{
    public TestCases(TestFixture fixture)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误如下:

消息:System.AggregateException:发生一个或多个错误。---- 类装置类型“MyProj.Tests.TestFixture”具有一个或多个未解析的构造函数参数:IConfiguration 配置 ---- 以下构造函数参数没有匹配的装置数据:TestFixture 装置

bar*_*ost 0

我想知道为什么我有像你这样的代码,因为文档(https://xunit.github.io/docs/shared-context)没有说任何关于在 Fixtures 中使用 DI 的事情......在我的例子中,我通过删除 DI 解决了这个问题,因为我犯了和你一样的错误。

然后我有这样的代码来为单元测试提供服务集合。

var services = new ServiceCollection();
ConfigureServices(services);
IServiceProvider serviceProvider = services.BuildServiceProvider();

// Assign shortcuts accessors to registered components
UserManager = serviceProvider.GetRequiredService<UserManager<User>>();
RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole<string>>>();
Run Code Online (Sandbox Code Playgroud)

我的 ConfigureServices() 在将服务注册到集合之前调用此代码,因此这回答了您有关 IConfiguration 的问题。请注意,我现在使用.net core 2.1,之前使用过2.0。但我仍然像你和其他评论的人一样想知道,为什么 DI 之前没有崩溃?

private static IConfiguration LoadConfiguration()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");

        return builder.Build();
    }
Run Code Online (Sandbox Code Playgroud)