已回答 单元测试过滤器属性?

豆镇

会员
已加入
2019年2月15日
留言内容
15
编程经验
5-10
大家好,

我正在为我拥有的实用程序类中的这种特殊方法进行单元测试。我能够使用ValidateModel来测试验证模型的数据注释,效果非常好。任何想法如何测试此方法以覆盖这些行,谢谢您的帮助:

[AttributeUsage(AttributeTargets.Method)]
公共类SuppressModelStateInvalidFilterAttribute:属性,IActionModelConvention
{
私有静态只读Type ModelStateInvalidFilterFactory = typeof(ModelStateInvalidFilter).Assembly.GetType("Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilterFactory");

公共无效Apply(ActionModel动作)
{
对于(var i = 0; i<action.Filters.Count;我++)
{
如果(action.Filters 是ModelStateInvalidFilter || action.Filters.GetType()== ModelStateInvalidFilterFactory)
{
action.Filters.RemoveAt(i);
打破;
}
}
}
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
你是在打我们吗?

In the arrange phase setup a ActionModel whose Filters property is of the class ModelStateInvalidFilter or ModelStateInvalidFilterFactory, as well as other object types that implement IList.

In the action phase, pass in that ActionModel.

In the assert phase, verify that the your class' RemoveAt() was called, or not called as appropriate.
 
Last edited:

豆镇

会员
已加入
2019年2月15日
留言内容
15
编程经验
5-10
为了验证模型,我在单元测试中使用了它:


ValidationResult:
private IList<ValidationResult> ValidateModel(object model)

              {

                     var validationResults = new 清单<ValidationResult>();

                     var ctx = new ValidationContext(model, null, null);

                     Validator.TryValidateObject(model, ctx, validationResults, true);

                     return validationResults;

              }
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
在此论坛上发布代码时,请编辑您的帖子,并使用提供的代码标签按钮。

谢谢
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
也许我不明白。您说要对属性类进行单元测试。因此,对属性类进行单元测试。当前使用#4中的代码,您似乎正在尝试进行完整的集成测试。
 

豆镇

会员
已加入
2019年2月15日
留言内容
15
编程经验
5-10
也许我不明白。您说要对属性类进行单元测试。因此,对属性类进行单元测试。当前使用#4中的代码,您似乎正在尝试进行完整的集成测试。
.Net Core现在具有自动处理模型状态400响应的功能,而以前使用MVC时,您必须在操作结果中使用ModelState.IsValid处理它。因此,有两种选择:1.)在启动文件上应用抑制模型无效,该文件将自动验证并抛出错误请求,但它永远不会在控制器中输入您的操作,或者2.)在我的情况下,我想控制我想真正进入控制器动作的某些动作,因为我想记录例如进入的请求,这是我用[SuppressModelStateInvalidFilter]标记控制器动作的地方。就我而言,您需要为filter属性创建一个扩展名,如我在原始帖子中所示。

为了测试数据注释,我为ValidateModel发布的内容用于对模型进行单元测试。但是,我试图弄清楚如何测试扩展过滤器,因为我找不到任何示例,类似于您必须对OnAuthorize属性进行单元测试的方式,因此这就是我发布的原因。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,我知道.NET Core具有该支持。但这仍然不能回答我为什么要进行完整的集成测试而不是单元测试的问题。

让我这样说吧。假设您已经为飞机设计了一种新型螺旋桨。螺旋桨的单元测试是将螺旋桨置于轴上并将其放入风洞中。集成测试是将螺旋桨放在飞机上,然后将飞机带出飞行。
 

豆镇

会员
已加入
2019年2月15日
留言内容
15
编程经验
5-10
是的,我知道.NET Core具有该支持。但这仍然不能回答我为什么要进行完整的集成测试而不是单元测试的问题。

让我这样说吧。假设您已经为飞机设计了一种新型螺旋桨。螺旋桨的单元测试是将螺旋桨置于轴上并将其放入风洞中。集成测试是将螺旋桨放在飞机上,然后将飞机带出飞行。
我明白您的意思,因此验证模型测试实际上不是测试每个模型属性正确的单元测试吗?

即我有很多这样的测试,也许我不应该作为单元测试的一部分。我之所以添加它们,仅仅是因为我试图测试将要返回的每个请求的错误请求,例如(inputParameters是我的模型,其所有数据注释均是其传输对象)。在这些情况下,当我测试每个模型数据注释属性时,即不进行集成测试时。

Unit tes:
Assert.IsTrue(ValidateModel(inputParameters).Any(v => v.MemberNames.Contains("CustomerId")));
 
Last edited:
最佳 底部