我正试图在我的测试类中添加一个可以重新请求的对象。我无法执行此操作,因为显然没有使用静态方法。
var mockConfiguration = new Mock<IConfiguration>();
mockConfiguration.Setup(f => f.AsEnumerable()
.Where(kvp => kvp.Key.StartsWith($"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:") && kvp.Value != null)
.Select(kvp => kvp.Value)).Returns(new List<string>() {
"Android 5",
"Android 6",
"Darwin Kernel Version 15",
"Darwin Kernel Version 16",
"Windows 10",
"Windows 6.2",
"Windows 6.3"
}.AsEnumerable());
有人可以告诉我怎么做吗?
答案 0 :(得分:2)
您不能模拟静态方法,因此所有LINQ方法都不是(简单的)可模拟的(事实上,由于命名空间的排序和将选择哪种扩展方法,这是可能的),但这不是您想要的
相反,您应该创建一个提供所需数据的实例(无论是模拟的还是真实的),并将其注入您要测试的方法中。
对于IConfiguration
,甚至不需要模拟。您可以使用提供所需数据的现有实现。
因此,对于您的情况,我将使用以下内容:
[Fact]
public void ConfigurationContainsSupportedVersions()
{
var config = CreateConfiguration();
var items = config.GetSection($"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions").Get<List<string>>();
Assert.Equal(7, items.Count);
}
private static IConfiguration CreateConfiguration()
{
return new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:0", "Android 5" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:1", "Android 6" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:2", "Darwin Kernel Version 15" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:3", "Darwin Kernel Version 16" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:4", "Windows 10" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:5", "Windows 6.2" },
{ $"CheckerConfigurations:{nameof(OSVersionChecker)}:SupportedVersions:6", "Windows 6.3" },
})
.Build();
}
此config
实例可以转发到使用IConfiguration并产生所需输出的任何方法。