Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用模拟匿名类型的设置?_C#_Moq - Fatal编程技术网

C# 如何使用模拟匿名类型的设置?

C# 如何使用模拟匿名类型的设置?,c#,moq,C#,Moq,我拥有以下存储库: interface IReportingRepository where T: Report { IEnumerable<T> GetReports<T>(object constraints); } 因此,我可以设置使用正确匿名类型的期望值。您可以使用自定义匹配器,并提供一些反射帮助: var reportingRepostory = new Mock<IReportingRepository>(); reportingRep

我拥有以下存储库:

interface IReportingRepository where T: Report
{
     IEnumerable<T> GetReports<T>(object constraints);
}

因此,我可以设置使用正确匿名类型的期望值。

您可以使用自定义匹配器,并提供一些反射帮助:

var reportingRepostory = new Mock<IReportingRepository>();
reportingRepostory
    .Setup(x => x.GetReports<ServiceReport>(HasProperties()))
    .Returns(new List<ServiceReport>(){Report1, Report2});

一些原始解决方案无法发现的实现错误:

new {Activated = true, Enabled = false}
new {Activated = true, Enabled = true, Extra = "I'm not meant to be here!"}
new {Activated = true, Enabled = "true"}
根据IReportingRepository GetReports方法实现的复杂性,可能需要考虑验证匿名类型的属性值和值类型是否符合预期,以及是否仅存在预期的属性

var reportingRepostory = new Mock<IReportingRepository>();
reportingRepostory
    .Setup(x => x.GetReports<ServiceReport>(IsAnonymousType(new {Activated = true, Enabled = true})))
    .Returns(new List<ServiceReport>(){Report1, Report2});
var reportingRepostory = new Mock<IReportingRepository>();
reportingRepostory
    .Setup(x => x.GetReports<ServiceReport>(HasProperties()))
    .Returns(new List<ServiceReport>(){Report1, Report2});
private object HasProperties()
{
    return Match.Create(
        (object o)  =>
        {
            var properties = o.GetType().GetProperties();
            return properties.Any(p => p.Name == "Available")
                && properties.Any(p => p.Name == "Enabled");
        });
}    
new {Activated = true, Enabled = false}
new {Activated = true, Enabled = true, Extra = "I'm not meant to be here!"}
new {Activated = true, Enabled = "true"}
var reportingRepostory = new Mock<IReportingRepository>();
reportingRepostory
    .Setup(x => x.GetReports<ServiceReport>(IsAnonymousType(new {Activated = true, Enabled = true})))
    .Returns(new List<ServiceReport>(){Report1, Report2});
private static object IsAnonymousType(object expected)
{
    return Match.Create(
        (object actual) =>
        {
            if (expected == null)
            {
                if (actual == null)
                    return true;
                else
                    return false;
            }
            else if (actual == null)
                return false;

            var expectedPropertyNames = expected.GetType().GetProperties().Select(x => x.Name);
            var expectedPropertyValues = expected.GetType().GetProperties().Select(x => x.GetValue(expected, null));
            var actualPropertyNames = actual.GetType().GetProperties().Select(x => x.Name);
            var actualPropertyValues = actual.GetType().GetProperties().Select(x => x.GetValue(actual, null));

            return expectedPropertyNames.SequenceEqual(actualPropertyNames)
                && expectedPropertyValues.SequenceEqual(actualPropertyValues);
        });
}