如何最小化Linq扩展方法

时间:2018-10-22 11:23:11

标签: c# .net unit-testing moq

我正试图在我的测试类中添加一个可以重新请求的对象。我无法执行此操作,因为显然没有使用静态方法。

    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());

有人可以告诉我怎么做吗?

1 个答案:

答案 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并产生所需输出的任何方法。