ServiceCollection devuelve nulo para IOptions aunque GetSection esté funcionando

Tengo problemas para construir manualmente unIServiceProvider eso permitirá que mis pruebas unitarias lo usen para extraer la configuración de prueba compartida usandoGetService<IOptions<MyOptions>>

Creé algunas pruebas unitarias para ilustrar mis problemas, también el repositorio para esto puede serencontrado aquí si es útil para responder la pregunta

El JSON

{
  "Test": {
    "ItemOne":  "yes"
  }
}

La clase de opciones

public class TestOptions
{
    public string ItemOne { get; set; }
}

Los exámenes

Fuera de estas pruebasConfigureWithBindMethod yConfigureWithBindMethod ambos fallan, dondeSectionIsAvailable pases Por lo que puedo decir, la sección se está consumiendo como se esperaba del archivo JSON.

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void ConfigureWithoutBindMethod()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        collection.Configure<TestOptions>(config.GetSection("Test"));

        var services = collection.BuildServiceProvider();

        var options = services.GetService<IOptions<TestOptions>>();

        Assert.IsNotNull(options);
    }

    [TestMethod]
    public void ConfigureWithBindMethod()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        collection.Configure<TestOptions>(o => config.GetSection("Test").Bind(o));

        var services = collection.BuildServiceProvider();

        var options = services.GetService<IOptions<TestOptions>>();

        Assert.IsNotNull(options);
    }

    [TestMethod]
    public void SectionIsAvailable()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        var section = config.GetSection("Test");
        Assert.IsNotNull(section);
        Assert.AreEqual("yes", section["ItemOne"]);
    }
}

Posiblemente útil para señalar

Cuando llameconfig.GetSection("Test") en la ventana inmediata, obtengo este valor

{Microsoft.Extensions.Configuration.ConfigurationSection}
    Key: "Test"
    Path: "Test"
    Value: null

A primera vista, habría asumido que Value no debería ser nulo, lo que me lleva a pensar que podría estar perdiendo algo obvio aquí, así que si alguien puede detectar lo que estoy haciendo mal, sería genial.

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta