An opinionated library that provides base unit test and fixture classes based on the Microsoft.Extensions.*
packages used by modern .NET applications.
There are base classes for unit and integration tests. Each test method has its own service collection configured through a class fixture.
Create a test class that extends BaseUnitTest<>
and accepts a class fixture that extends BaseUnitFixture
.
In the fixture class, you can:
- Override
ConfigureServices(services)
to add, remove or update dependencies for each test method. - Override
ConfigureConfiguration(builder)
to makes changes to the generated sharedIConfiguration
. - Access the generated
IConfiguration
throughthis.Configuration
.
In the test class, you can:
- Access the fixture through
this.Fixture
. - Access the .NET logger through
this.Logger
- it is connected to the Xunit'sITestOutputHelper
. - Access the
IServiceProvider
which has been configured by the fixture throughthis.Services
.
By default, unit tests come with an xunit-connected ILogger
and an empty IConfiguration
.
Create a test class that extends BaseIntegrationTest<>
and accepts a class fixture that extends BaseIntegrationFixture
.
They both inherit from their respective BaseUnit*
class.
-
BaseIntegrationFixture
adds a defaultIHostEnvironment
where its environment name is:Local
by default,Test
on CI environments,- overrideable by defining a
DOTNET_ENVIRONMENT
environment variable, such as in .NET modern applications.
-
BaseIntegrationFixture
addsappsettings.json
andappsettings.{environment}.json
optional configuration providers and also an environment variable configuration provider.
public class MyUnitTests : BaseUnitTest<MyUnitFixture>
{
public MyUnitTests(MyUnitFixture fixture, ITestOutputHelper testOutputHelper)
: base(fixture, testOutputHelper)
{
}
[Fact]
public void Some_Test_Works()
{
var myClass = this.Services.GetRequiredService<MyClass>();
myClass.DoWork();
}
}
public class MyUnitFixture : BaseUnitFixture
{
protected override IConfigurationBuilder ConfigureConfiguration(IConfigurationBuilder builder)
{
// Executed once per fixture instance
return base.ConfigureConfiguration(builder).AddInMemoryCollection(new Dictionary<string, string>
{
["My:Config:Variable"] = "foo",
});
// In an integration fixture, you could add concrete configuration providers, such as:
// builder.AddAzureKeyVault(...);
}
public override IServiceCollection ConfigureServices(IServiceCollection services)
{
// Executed for each test method
return base.ConfigureServices(services)
.AddTransient<MyClass>()
.AddTransient<IDependency>(new MyFakeDependency());
}
}
Please see CONTRIBUTING
Copyright © 2022, Workleap. This code is licensed under the Apache License, Version 2.0. You may obtain a copy of this license at https://github.com/gsoft-inc/gsoft-license/blob/master/LICENSE.