Populate IConfiguration for unit tests
You can use the following technique to mock IConfiguration.GetValue<T>(key)
extension method.
var configuration = new Mock<IConfiguration>();
var configSection = new Mock<IConfigurationSection>();
configSection.Setup(x => x.Value).Returns("fake value");
configuration.Setup(x => x.GetSection("MySection")).Returns(configSection.Object);
//OR
configuration.Setup(x => x.GetSection("MySection:Value")).Returns(configSection.Object);
The solution I went for (which answers the question title at least!) is to use a settings file in the solution testsettings.json
and set it to "Copy Always".
private IConfiguration _config;
public UnitTestManager()
{
IServiceCollection services = new ServiceCollection();
services.AddSingleton<IConfiguration>(Configuration);
}
public IConfiguration Configuration
{
get
{
if (_config == null)
{
var builder = new ConfigurationBuilder().AddJsonFile($"testsettings.json", optional: false);
_config = builder.Build();
}
return _config;
}
}
You can use MemoryConfigurationBuilderExtensions
to provide it via a dictionary.
using Microsoft.Extensions.Configuration;
var myConfiguration = new Dictionary<string, string>
{
{"Key1", "Value1"},
{"Nested:Key1", "NestedValue1"},
{"Nested:Key2", "NestedValue2"}
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(myConfiguration)
.Build();
The equivalent JSON would be:
{
"Key1": "Value1",
"Nested": {
"Key1": "NestedValue1",
"Key2": "NestedValue2"
}
}
The equivalent Environment Variables would be (assuming no prefix / case insensitive):
Key1=Value1
Nested__Key1=NestedValue1
Nested__Key2=NestedValue2
The equivalent Command Line parameters would be:
dotnet myapp.dll \
-- \
--Key1=Value1 \
--Nested:Key1=NestedValue1 \
--Nested:Key2=NestedValue2