c# - 测试 MVC 控制器方法的属性数量
问题描述
我有一个包含以下 post 方法的 MVC 控制器:
[HttpPost]
[PermissionLevel(PermissionLevel.Manage)]
public async Task<IActionResult> CreateUserAsync([FromBody] User user)
{
user = await _usersService.CreateUserAsync(user);
return Created($"{_microservices.Users}/{user.Id}", user);
}
我正在尝试对该控制器进行单元测试(使用 MSTest),并且我要进行的一项测试检查是否已将正确的路由和权限属性应用于该方法。我还想确保方法上不存在其他属性,我目前正在通过检查方法上的属性计数来做到这一点:
[TestMethod]
public void CreateUserAsync_HasTwoAttributes()
{
int count = typeof(UsersController).GetMethod(nameof(UsersController.CreateUserAsync))
.GetCustomAttributes()
.Count();
Assert.AreEqual(2, count);
}
这在我的应用程序的其他地方(对于属性)运行良好,但是当我运行测试时,断言失败,说该方法实际上有 4 个属性:
{System.Runtime.CompilerServices.AsyncStateMachineAttribute}
{System.Diagnostics.DebuggerStepThroughAttribute}
{Microsoft.AspNetCore.Mvc.HttpPostAttribute}
{Permissions.Models.Filters.PermissionLevelAttribute}
AsyncStateMachine-
和DebuggerStepThrough-
属性从何而来?有没有办法我不能包含它们而只查看在控制器方法上显式声明的属性?
我在用着:
- .NET 核心 2.1
- MSTest SDK 15.9.0
任何帮助,将不胜感激 :)
解决方案
AsyncStateMachine- 和 DebuggerStepThrough- 属性从何而来?
这些额外的属性是在编译时添加的。异步添加AsyncStateMachineAttribute
当方法 (MethodName) 具有 Async 或 async 修饰符时,编译器会发出包含状态机结构的 IL。此结构包含方法中的代码。该 IL 还包含一个调用状态机的存根方法 (MethodName)。编译器将 AsyncStateMachine 属性添加到存根方法中,以便工具可以识别相应的状态机。发出的 IL 的详细信息可能会在编译器的未来版本中发生变化。
和调试模式添加了其他.
推荐阅读
- javascript - 如何在 npm install 不工作时使用它
- android-studio - Android Studio 10 秒后自动执行断点?
- vue.js - bootstrap vue 所有带有路由器链接的 b-dropdown-item 都处于活动状态
- python - 从最后一行获取数据帧的索引列的值
- javascript - JavaScript JSON Math - 在对象中添加元素
- javascript - 无法在javascript中修改全局变量
- php - 输入正确的详细信息且未显示错误后,登录页面未重定向到 index.php
- c# - 无法隐式转换类型'System.collections.generic.IEnumerable
'到'串' - logic - ALC 表格算法示例
- rust - 无法可变地借用 RefCell 内的内容,即使在前一个可变借用的范围已经结束之后