【发布时间】: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