繁体   English   中英

如何使用 FakeItEasy 语法模拟 configuration.GetSection?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM