在.Net Core中通常使用IConfiguration来读取程序的配置信息,但是IConfiguratio.GetValue<>是一个扩展方法,不能Mock。其实如果去读一下IConfiguration的实现,我们就知道IConfiguration.GetValue是通过IConfigurationSection来实现的,我们可以通过Mock IConfigurationSection来解决问题。下面是示例代码:
var configMock = new Mock<IConfiguration>();
var configSectionMock1 = new Mock<IConfigurationSection>();
var configSectionMock2 = new Mock<IConfigurationSection>();
configSectionMock1.Setup(o => o.Value).Returns(1);
configSectionMock2.Setup(o => o.Value).Returns(2);
configMock.Setup(c => c.GetSection("MinSpeed")).Returns(configSectionMock1.Object);
configMock.Setup(c => c.GetSection("MaxSpeed")).Returns(configSectionMock2.Object);
var myApp = new CourierManager(configMock.Object);
// Use your config value
// ...
上面的程序要取两个配置值 MinSpeed 和 MaxSpeed,通过设置两个 IConfigurationSection 解决了这个问题。以上程序使用的 Moq。