C# 向测试注册公开IServiceCollection的最佳方法?

C# 向测试注册公开IServiceCollection的最佳方法?,c#,unit-testing,asp.net-core,nunit,C#,Unit Testing,Asp.net Core,Nunit,我正在更新一些旧的autofac代码,我已经用了一段时间来测试国际奥委会的注册情况;将其与aspnetcore中的MS内置IOC容器一起使用。一些较新的API是在aspnetcore中构建的,不使用autofac 下面是我正在玩的沙箱: namespace GatewayProxy.Tests { [TestFixture] public class Tests : GivenTheNetCoreService<ITestReg> { priv

我正在更新一些旧的autofac代码,我已经用了一段时间来测试国际奥委会的注册情况;将其与aspnetcore中的MS内置IOC容器一起使用。一些较新的API是在aspnetcore中构建的,不使用autofac

下面是我正在玩的沙箱:

namespace GatewayProxy.Tests
{
    [TestFixture]
    public class Tests : GivenTheNetCoreService<ITestReg>
    {
        private TestServer _server;
        private HttpClient _client;

        protected override void GivenThat()
        {
            _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
            _client = _server.CreateClient();
            base.GivenThat();
        }

        [Test]
        public void Test1()
        {
            Result.Should().BeOfType<TestReg>();
        }
    }

    [TestFixture]
    public abstract class GivenTheNetCoreService<T> where T : class
    {
        private ServiceCollection _serviceCollection;
        public T Result { get; private set; }

        [OneTimeSetUp]
        public void Setup()
        {
            GivenThat();

            When();
        }

        protected virtual void GivenThat()
        {
            _serviceCollection = new ServiceCollection();
        }

        protected virtual void When()
        {
            using (var serviceProvider = _serviceCollection.BuildServiceProvider().CreateScope())
            {
                Result = serviceProvider.ServiceProvider.GetRequiredService<T>();
            }
        }
    }
}
名称空间网关代理。测试
{
[测试夹具]
公共类测试:GivenTheNetCoreService
{
专用测试服务器(TestServer);;
私有HttpClient \u客户端;
受保护的覆盖void GivenThat()
{
_服务器=新的TestServer(新的WebHostBuilder().UseStartup());
_client=_server.CreateClient();
base.GivenThat();
}
[测试]
公共void Test1()
{
Result.Should().BeOfType();
}
}
[测试夹具]
公共抽象类GivenTheNetCoreService,其中T:class
{
私人ServiceCollection _ServiceCollection;
公共T结果{get;私有集;}
[一次性设置]
公共作废设置()
{
GivenThat();
When();
}
受保护的虚拟void GivenThat()
{
_serviceCollection=新serviceCollection();
}
受保护的虚拟void When()
{
使用(var serviceProvider=\u servicecolection.BuildServiceProvider().CreateScope())
{
结果=serviceProvider.serviceProvider.GetRequiredService();
}
}
}
}
在我的startup.cs中,我有:

私有无效IOCreditions(IServiceCollection服务)
{
services.AddTransient();
}

Result
属性为空,因为
ServiceProvider
中没有任何“已实现的服务”。那么,测试
ITestReg
是否已正确注册的最佳方法是什么?

您可以通过
server.Host.services
访问服务

using Microsoft.Extensions.DependencyInjection;

var server = new TestServer(
                WebHost.CreateDefaultBuilder()
                        .UseStartup<Startup>()
    );
var testReg = server.Host.Services.GetRequiredService<ITestReg>();
var test = testReg.HelloWorld();
使用Microsoft.Extensions.DependencyInjection;
var server=新的TestServer(
WebHost.CreateDefaultBuilder()
.UseStartup()
);
var testReg=server.Host.Services.GetRequiredService();
var test=testReg.HelloWorld();

我看不出您在哪里注册ITestReg?你想测试你的启动是哪个注册了ITestReg,或者你的用例是什么?Ty-这很有效,但是代码非常难看-需要对它进行一些重构。
using Microsoft.Extensions.DependencyInjection;

var server = new TestServer(
                WebHost.CreateDefaultBuilder()
                        .UseStartup<Startup>()
    );
var testReg = server.Host.Services.GetRequiredService<ITestReg>();
var test = testReg.HelloWorld();