首页 > 解决方案 > 测试 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 个属性:

AsyncStateMachine-DebuggerStepThrough-属性从何而来?有没有办法我不能包含它们而只查看在控制器方法上显式声明的属性?

我在用着:

任何帮助,将不胜感激 :)

标签: c#.netunit-testingmodel-view-controllermstest

解决方案


AsyncStateMachine- 和 DebuggerStepThrough- 属性从何而来?

这些额外的属性是在编译时添加的。异步添加AsyncStateMachineAttribute

当方法 (MethodName) 具有 Async 或 async 修饰符时,编译器会发出包含状态机结构的 IL。此结构包含方法中的代码。该 IL 还包含一个调用状态机的存根方法 (MethodName)。编译器将 AsyncStateMachine 属性添加到存根方法中,以便工具可以识别相应的状态机。发出的 IL 的详细信息可能会在编译器的未来版本中发生变化。

和调试模式添加了其他.


推荐阅读