Use Microsoft.Extensions.DependencyInjection to resolve xUnit test cases.
Install the Nuget package.
Install-Package Xunit.DependencyInjection
In your testing project, add the following framework
namespace Your.Test.Project
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IDependency, DependencyClass>();
}
}
}
Example test class
.
public interface IDependency
{
int Value { get; }
}
internal class DependencyClass : IDependency
{
public int Value => 1;
}
public class MyAwesomeTests
{
private readonly IDependency _d;
public MyAwesomeTests(IDependency d) => _d = d;
[Fact]
public void AssertThatWeDoStuff()
{
Assert.Equal(1, _d.Value);
}
}
Install-Package Microsoft.AspNetCore.TestHost
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) =>
hostBuilder.ConfigureWebHost(webHostBuilder => webHostBuilder
.UseTestServer()
.Configure(Configure)
.ConfigureServices(services => services.AddRouting()));
private void Configure(IApplicationBuilder app) =>
app.UseRouting().UseEndpoints(endpoints => xxx);
}
- Don't need to add the assembly attribute
TestFramework
. Startup
does not need to inheritDependencyInjectionTestFramework
.Configure
method support multiple parameters, like asp.net core Startup.
-[assembly: TestFramework("Your.Test.Project.Startup", "Your.Test.Project")]
namespace Your.Test.Project
{
- public class Startup : DependencyInjectionTestFramework
+ public class Startup
{
- public Startup(IMessageSink messageSink) : base(messageSink) { }
- protected void ConfigureServices(IServiceCollection services)
+ public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IDependency, DependencyClass>();
}
- protected override IHostBuilder CreateHostBuilder() =>
- base.CreateHostBuilder(assemblyName)
- .ConfigureServices(ConfigureServices);
- protected override void Configure(IServiceProvider provider)
+ public void Configure(IServiceProvider provider)
}
}
- CreateHostBuilder method
public class Startup
{
public IHostBuilder CreateHostBuilder([AssemblyName assemblyName]) { }
}
- ConfigureHost method
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) { }
}
- ConfigureServices method
public class Startup
{
public void ConfigureServices(IServiceCollection services[, HostBuilderContext context]) { }
}
- Configure method Anything defined in ConfigureServices, can be specified in the Configure method signature. These services are injected if they're available.
Default is find Your.Test.Project.Startup, Your.Test.Project
.
If you want use a special Startup
, you can defined XunitStartupAssembly
and XunitStartupFullName
in PropertyGroup
section
<Project>
<PropertyGroup>
<XunitStartupAssembly>Abc</XunitStartupAssembly>
<XunitStartupFullName>Xyz</XunitStartupFullName>
</PropertyGroup>
</Project>
XunitStartupAssembly | XunitStartupFullName | Startup |
---|---|---|
Your.Test.Project.Startup, Your.Test.Project | ||
Abc | Abc.Startup, Abc | |
Xyz | Xyz, Your.Test.Project | |
Abc | Xyz | Xyz, Abc |
namespace Your.Test.Project
{
public class Startup : DependencyInjectionTestFramework
{
public Startup(IMessageSink messageSink) : base(messageSink) { }
- protected override void ConfigureServices(IServiceCollection services)
+ protected void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IDependency, DependencyClass>();
}
+ protected override IHostBuilder CreateHostBuilder(AssemblyName assemblyName) =>
+ base.CreateHostBuilder(assemblyName)
+ .ConfigureServices(ConfigureServices);
}
}
internal class DependencyClass : IDependency
{
private readonly ITestOutputHelperAccessor _testOutputHelperAccessor;
public DependencyClass(ITestOutputHelperAccessor testOutputHelperAccessor)
{
_testOutputHelperAccessor = testOutputHelperAccessor;
}
}
public class Startup
{
public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor accessor) =>
loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(accessor));
}
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) =>
hostBuilder
.ConfigureServices((context, services) => { context.XXXX });
}
or
public class Startup
{
public void ConfigureServices(IServiceCollection services, HostBuilderContext context)
{
context.XXXX;
}
}
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) =>
hostBuilder
.ConfigureHostConfiguration(builder => { })
.ConfigureAppConfiguration((context, builder) => { });
}