![]() |
VOOZH | about |
dotnet add package Xunit.DependencyInjection.Demystifier --version 10.0.0
NuGet\Install-Package Xunit.DependencyInjection.Demystifier -Version 10.0.0
<PackageReference Include="Xunit.DependencyInjection.Demystifier" Version="10.0.0" />
<PackageVersion Include="Xunit.DependencyInjection.Demystifier" Version="10.0.0" />Directory.Packages.props
<PackageReference Include="Xunit.DependencyInjection.Demystifier" />Project file
paket add Xunit.DependencyInjection.Demystifier --version 10.0.0
#r "nuget: Xunit.DependencyInjection.Demystifier, 10.0.0"
#:package Xunit.DependencyInjection.Demystifier@10.0.0
#addin nuget:?package=Xunit.DependencyInjection.Demystifier&version=10.0.0Install as a Cake Addin
#tool nuget:?package=Xunit.DependencyInjection.Demystifier&version=10.0.0Install as a Cake Tool
Microsoft.Extensions.DependencyInjection to resolve xUnit test casesXUnit v2 users: please use v2 branch, Xunit.DependencyInjection.StaFact and Xunit.DependencyInjection.xRetry depend on upstream packages, waiting for update.
Install the Nuget package.
dotnet add 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);
}
}
Xunit.DependencyInjectionis built into the generic host and fully supports its lifecycle, allowing you to use all features supported by the generic host, including but not limited toIHostedService.
dotnet add package Microsoft.AspNetCore.TestHost
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) => hostBuilder
.ConfigureWebHost[Defaults](webHostBuilder => webHostBuilder
.UseTestServer(options => options.PreserveExecutionContext = true)
.UseStartup<AspNetCoreStartup>());
}
If you use MinimalApi rather than asp.net core Startup class.
Add package reference for Xunit.DependencyInjection.AspNetCoreTesting
dotnet add package Xunit.DependencyInjection.AspNetCoreTesting
public class Startup
{
public IHostBuilder CreateHostBuilder() => MinimalApiHostBuilderFactory.GetHostBuilder<Program>();
}
Maybe your asp.net core project should InternalsVisibleTo or add
public partial class Program {}in the end ofProgram.cs;Detail see Xunit.DependencyInjection.Test.AspNetCore
Startup limitationCreateHostBuilder methodpublic class Startup
{
public IHostBuilder CreateHostBuilder([AssemblyName assemblyName]) { }
}
ConfigureHost methodpublic class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) { }
}
ConfigureServices methodpublic class Startup
{
public void ConfigureServices(IServiceCollection services[, HostBuilderContext context]) { }
}
BuildHost method
NOTE: If this method signature is not found, the host is built by simply calling
hostBuilder.Build();.
public class Startup
{
public IHost BuildHost([IHostBuilder hostBuilder]) { return hostBuilder.Build(); }
}
Configure method
Anything defined in ConfigureServices, can be specified in the Configure method signature. These services are injected if they're available.
Startup?Declare [Startup] on test class
public class TestClass1
{
public class Startup
{
public void ConfigureServices(IServiceCollection services) { }
}
If the class type full name is "A.B.C.TestClass", find Startup in the following order:
A.B.C.StartupA.B.StartupA.StartupStartupDefault startup is required before 8.7.0, is optional in some case after 8.7.0.
If is required, please add a startup class in your test project.
Default is find Your.Test.Project.Startup, Your.Test.Project.
If you want to use a special Startup, you can define XunitStartupAssembly and XunitStartupFullName in the 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 |
By default, xUnit runs all test cases in a test class synchronously. This package can extend the test framework to execute tests in parallel.
<Project>
<PropertyGroup>
<ParallelizationMode></ParallelizationMode>
</PropertyGroup>
</Project>
This package has two policies to run test cases in parallel.
Enhance or true
Respect xunit parallelization behavior.
Force
Ignore xunit parallelization behavior and force running tests in parallel.
If [Collection](if ParallelizationMode is not Force), [CollectionDefinition(DisableParallelization = true)], [DisableParallelization] declared on the test class, the test class will run sequentially. If [DisableParallelization], [MemberData(DisableDiscoveryEnumeration = true)] declared on the test method, the test method will run sequentially.
It is recommended to use xunit 2.8.0+ and without setting parallelAlgorithm
<Project>
<PropertyGroup>
<EnableXunitDependencyInjectionDefaultTestFrameworkAttribute>false</EnableXunitDependencyInjectionDefaultTestFrameworkAttribute>
</PropertyGroup>
</Project>
internal class DependencyClass : IDependency
{
private readonly ITestOutputHelperAccessor _testOutputHelperAccessor;
public DependencyClass(ITestOutputHelperAccessor testOutputHelperAccessor)
{
_testOutputHelperAccessor = testOutputHelperAccessor;
}
}
Microsoft.Extensions.Logging to ITestOutputHelperAdd package reference for Xunit.DependencyInjection.Logging
dotnet add package Xunit.DependencyInjection.Logging
The call chain must be from the test case. If not, this feature will not work.
public class Startup
{
public void ConfigureServices(IServiceCollection services) => services
.AddLogging(lb => lb.AddXunitOutput());
}
IConfiguration or IHostEnvironment into Startup?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;
}
}
IConfiguration?public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder) => hostBuilder
.ConfigureHostConfiguration(builder => { })
.ConfigureAppConfiguration((context, builder) => { });
}
Use [MethodData]
TracerProviderBuilder builder;
builder.AddSource("Xunit.DependencyInjection");
Inherit BeforeAfterTest and register as BeforeAfterTest service.
If it is synchronous initialization, you can use the Configure method. If it is asynchronous initialization, you should use IHostedService.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 was computed. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 netstandard2.1 is compatible. |
| .NET Framework | net472 net472 is compatible. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
Use Ben.Demystifier Formate Exception.
public void ConfigureServices(IServiceCollection services)
{
services.UseDemystifyExceptionFilter();
}