[英]C# how to mock Configuration.GetSection(“foo:bar”).Get<List<string>>()
[英]How to mock configuration.GetSection with FakeItEasy syntax?
我有以下 appsettings.json 配置。
"SettingsConfig": [
{
"Name": "Something",
"Node": "Something",
"SettingName": "Something"
},
{
"Name": "Something",
"Node": "Something",
"SettingName": "Something"
}]
我想写 UnitTest,但下面的语法不起作用。
_configuration = A.Fake<IConfiguration>();
A.CallTo(() => _configuration.GetSection("SettingsConfig")).Returns(new List<SettingsConfig>());
错误消息:IConfigurationSection 不包含 Returns 的定义。
如何使用 FakeItEasy 语法模拟 IConfiguration 以便为 UnitTesting 应用模拟数据?
如果您查看 IConfiguration.GetSection() 的返回值,您会发现它期望返回IConfigurationSection
。 这是这里的第一个问题。
除此之外,为了从配置中提取您的列表,您需要执行类似的操作
_configuration.GetSection("SettingsConfig").Get<List<SettingsConfig>>();
不幸的是, IConfigurationSection
上的.Get<>
方法是一个扩展方法,它不能被 FakeItEasy 伪造。 您将收到以下错误:
The current proxy generator can not intercept the method Microsoft.Extensions.Configuration.ConfigurationBinder.Get... - Extension methods can not be intercepted since they're static.
如果需要对其进行测试,则需要在包装扩展方法的IConfiguration
前面放置另一个接口。
否则,要伪造您的配置文件,您可以执行以下操作:
var fakeConfigSection = A.Fake<IConfigurationSection>();
A.CallTo(() => fakeConfigSection["Name"])
.Returns("MyFakedConfigValue");
var fakeConfig = A.Fake<IConfiguration>();
A.CallTo(() => fakeConfig.GetSection("SettingsConfig"))
.Returns(fakeConfigSection);
首先,您应该实现从文件中读取的方法,该方法存在于单元测试的项目中。 因此,如果没有您可以从中读取的 file.json,则根本无法获得 GetSection。 所以在那里添加文件然后应用:
private IConfiguration ApplyConfiguration()
{
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("settingsConfig.json");
var config = configurationBuilder.Build();
config.GetSection("settingsConfig").Get<List<SettingsConfig>>();
return config;
}
然后在您的业务逻辑中添加:
var config = ApplyConfiguration();
您将看到 config 包含所有配置,因此根本不需要调用 OnCall.Returns()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.