【问题标题】:How to mock configuration.GetSection with FakeItEasy syntax?如何使用 FakeItEasy 语法模拟 configuration.GetSection?
【发布时间】:2022-01-23 04:04:25
【问题描述】:

我有以下 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 应用模拟数据?

【问题讨论】:

  • 您确定在.Returns 之前没有缺少右括号) 吗?如果您的代码类似于:A.CallTo(() =&gt; _configuration.GetSection("SettingsConfig").Returns(new List&lt;SettingsConfig&gt;());,我预计会出现该错误
  • 不,括号没问题。您可以复制粘贴代码并查看它们是否正确。
  • 这是确切的错误信息吗?我收到一条不同的消息:'IReturnValueArgumentValidationConfiguration&lt;IConfigurationSection&gt;' does not contain a definition for 'Returns' and the best extension method overload 'ReturnValueConfigurationExtensions.Returns&lt;List&lt;UserQuery.SettingsConfig&gt;&gt;(IReturnValueConfiguration&lt;Task&lt;List&lt;UserQuery.SettingsConfig&gt;&gt;&gt;, List&lt;UserQuery.SettingsConfig&gt;)' requires a receiver of type 'IReturnValueConfiguration&lt;Task&lt;List&lt;UserQuery.SettingsConfig&gt;&gt;&gt;'
  • 我认为问题在于GetSection 返回IConfigurationSection,而不是List&lt;SettingsConfig&gt;。所以你不能配置返回List&lt;SettingsConfig&gt;的方法,它必须返回一个IConfigurationSection
  • 但我需要 List() 之后执行业务逻辑,否则它将保持为空

标签: c# .net fakeiteasy


【解决方案1】:

如果您查看IConfiguration.GetSection() 的返回值,您会发现它期望返回IConfigurationSection。这是这里的第一个问题。

除此之外,为了从配置中提取您的列表,您需要执行类似的操作

_configuration.GetSection("SettingsConfig").Get<List<SettingsConfig>>();

不幸的是,IConfigurationSection 上的.Get&lt;&gt; 方法是一种扩展方法,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);

【讨论】:

    【解决方案2】:

    首先,您应该实现从文件读取的方法,该方法存在于单元测试项目中。因此,如果没有您可以从中读取的文件 .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()。

    【讨论】:

    • 这不能回答问题。 OP 想要模拟 IConfiguration,而不是创建真实的配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多