Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Asp.net mvc 如何确定不可预测的LINQ查询结果的来源?_Asp.net Mvc_Linq_Nunit_Xval - Fatal编程技术网

Asp.net mvc 如何确定不可预测的LINQ查询结果的来源?

Asp.net mvc 如何确定不可预测的LINQ查询结果的来源?,asp.net-mvc,linq,nunit,xval,Asp.net Mvc,Linq,Nunit,Xval,我一直在开发一个应用程序,它使用xVal的服务器端验证和数据注释。我们最近遇到了一些错误,其中验证消息对于具有多个验证的字段是不可预测的,如果字段为空,则可能会失败(例如,需要电子邮件地址,但也无法通过有效性检查) 假设我只需要返回第一个验证错误,我向我们的验证运行程序添加了一个方法以实现该目标(更新:有关确切的方法,请参见底部的编辑): 问题是这个测试的输出是高度不可预测的。有时它会通过,有时它只返回一两个错误,有时一个也不返回。这里的问题是我的LINQ查询、我的测试,还是两者都有 编辑:用稍

我一直在开发一个应用程序,它使用xVal的服务器端验证和数据注释。我们最近遇到了一些错误,其中验证消息对于具有多个验证的字段是不可预测的,如果字段为空,则可能会失败(例如,需要电子邮件地址,但也无法通过有效性检查)

假设我只需要返回第一个验证错误,我向我们的验证运行程序添加了一个方法以实现该目标(更新:有关确切的方法,请参见底部的编辑):

问题是这个测试的输出是高度不可预测的。有时它会通过,有时它只返回一两个错误,有时一个也不返回。这里的问题是我的LINQ查询、我的测试,还是两者都有

编辑:用稍微不同的方法粘贴很好;下面是实际被击中的一个:

    public static IEnumerable<ErrorInfo> GetFirstErrors(object instance)
    {
        return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
               from attribute in prop.Attributes.OfType<ValidationAttribute>().Take(1)
               where !attribute.IsValid(prop.GetValue(instance))
               select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
公共静态IEnumerable GetFirstErrors(对象实例)
{
从TypeDescriptor.GetProperties(instance.Cast()中的prop返回
从prop.Attributes.OfType()中的属性获取(1)
其中!attribute.IsValid(prop.GetValue(实例))
选择新的ErrorInfo(prop.Name,attribute.FormatErrorMessage(string.Empty),instance);
}
尝试使用

var errors = DataAnnotationsValidationRunner.GetFirstErrors(test).ToArray();

摆脱
接受(1)
。我怀疑空字符串正在通过
Required
测试。如果您碰巧得到的是长度验证器,而不是长度验证器,则测试通过。

这是如何编译的
GetFirstErrors
需要一个类型param
T
,您从未显式或隐式指定过该类型。对此表示抱歉!我粘贴了适当的方法。我尝试了一下,仍然得到了不可预测的结果。但我注意到,当我离开NUnit时,清理/重新编译然后再次运行它是最容易更改的时候。Take(1)调用肯定是罪魁祸首。在属性选择上是否没有任何类型的隐含顺序或优先级(即,在任何其他属性之上检查必填字段属性)?这是可能的,但既然这是一个单元测试,为什么?你不应该检查测试数据上的所有属性吗?我当然同意,但是有什么更好的方法来强制执行全局规则,即每个字段显示一个验证错误(并支持所需的字段失败)?看起来模型状态错误已汇总到字典中供视图使用,因此如果选择是任意的,我们似乎无法预测将首先显示什么错误。您可以
orderby attribute.GetType()==typeof(RequiredAttribute)?0:1
如果你真的必须这么做的话。但ISTM这是一个显示问题,不是测试问题。我将重写
Html.ValidationMessage()
helper。
    public static IEnumerable<ErrorInfo> GetFirstErrors(object instance)
    {
        return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
               from attribute in prop.Attributes.OfType<ValidationAttribute>().Take(1)
               where !attribute.IsValid(prop.GetValue(instance))
               select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
var errors = DataAnnotationsValidationRunner.GetFirstErrors(test).ToArray();