【问题标题】:Testing the number of attributes on an MVC controller method测试 MVC 控制器方法上的属性数量
【发布时间】:2019-07-18 12:26:23
【问题描述】:

我有一个包含以下 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 Core 2.1
  • MSTest SDK 15.9.0

任何帮助将不胜感激:)

【问题讨论】:

  • 与其检查属性的数量,不如测试一下它是否具有特定的属性。
  • 是的,测试以确保它没有任何其他属性在我看来是多余的。只要您测试代码是否以您期望的方式执行,运行时是否向其添加属性或其他任何内容都无关紧要。总而言之,只需测试您添加的属性(以使代码按预期执行)是否确实有效。涵盖逻辑的其他单元测试应该涵盖任何其他场景。
  • @phuzi 我也在这样做,在另一个测试中,但如果添加了我指定的属性以外的任何属性,我想要一个失败的测试。
  • 对,您的集成测试将失败(因为路线已更改)。
  • @8ytan 这可能是XY problem。您应该测试预期行为而不是实施问题。

标签: c# .net unit-testing model-view-controller mstest


【解决方案1】:

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

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

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

调试模式添加other

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多