【问题标题】:Mock class with constructor that takes IConfiguration as parameter具有以 IConfiguration 作为参数的构造函数的模拟类
【发布时间】:2022-01-27 20:39:29
【问题描述】:

我想模拟类 IncidentData。

有构造函数的类:

public class IncidentData
{
    public IncidentData(IConfiguration configurationRoot)
    {
        configurationRoot.GetSection("CarambaAttributeData").Bind(this);
    }
}

我已经尝试向 setup 发送这样的模拟:

var incidentDataMock = new Mock<IncidentData>();
incidentDataMock.Setup(x => It.IsAny<IConfiguration>());

这让我“System.ArgumentOutOfRangeException:索引超出范围”

我应该模拟 IConfiguration 吗?我怎么做?最佳做法是什么?

【问题讨论】:

    标签: c# nunit moq


    【解决方案1】:

    这很可能是XY problem。您实际上想通过模拟该类来实现什么?

    至于报错,需要在创建mock的时候传入参数

    例如

    //...
    
    IConfiguration config = Mock.Of<IConfiguration>();
    var incidentDataMock = new Mock<IncidentData>(config); //<--NOTE constructor argument passed.
    
    //...
    

    或使用实际的IConfiguration 实例

    //...
    
    IConfiguration config = new ConfigurationBuilder()
        //...all extensions here
        //...
        .Build();
    var incidentDataMock = new Mock<IncidentData>(config); //<--NOTE constructor argument passed.
    
    //...
    

    参考Moq Quickstart 以更好地了解如何使用该库

    【讨论】:

    • 我正在尝试创建一个 IncidentData 的简单模拟以传递给另一个构造函数。 IConfiguration 实例是一个潜在的解决方案,我想,如果实际配置必须是“真实的”。
    • 那么为什么不手动创建一个主题类的实例并传入模拟配置呢?但无论哪种方式,注入 IConfiguration 都向我表明它们是代码异味,会导致进一步的问题。因此我的 XY 声明
    • 对!我将创建该实例并与我的同事一起讨论它。谢谢!
    【解决方案2】:

    据我了解,您正在寻找一种方法来模拟 ctor 的 configurationRoot 参数而不是整个 IncidentData 类。

    您需要做的就是创建一个内存集合,然后为配置实例注册一个内存集合提供程序。

    var carambaAttributeDataConfig = new Dictionary<string, string>
    {
       {"CarambaAttributeData:Key1", "Value1"},
       {"CarambaAttributeData:Key2", "Value2"},
       ...
       {"CarambaAttributeData:KeyN", "ValueN"},
    };
    
    IConfiguration config = new ConfigurationBuilder()
        .AddInMemoryCollection(carambaAttributeDataConfig)
        .Build();
    
    var incidentDataMock = new IncidentData(config);
    

    Reference

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多