控制器属性检查就像使用 [FromBody] 两次
Controller Attribute Check like using [FromBody] twice
在ASP.NET MVC中(无论版本如何,如果它很重要,假设我使用的是最新的Core 2.1)我们通过使用属性注释控制器来控制应用程序的行为和参数绑定,例如[HttpPost]
对于应该调用为 POST
的方法和 [FromQuery]
对于应该来自查询字符串的方法参数。
现在,正如我在过去几个月中艰难发现的那样,有 无数 种方法可以将其混合。例如,如果您将两个参数声明为 [FromBody]
,那么其中一个将始终是 null
,因为只有一个可以表示正文。或者,如果您的方法被标记为 [HttpGet]
,您的 [FromBody]
将返回 null
,因为标准表明它不是这样做的。相信我,犯错的方法还有很多。
我承认这些都是我的错误。如果我做对了,它就会起作用。然而,令我困惑的是,这是可以在编译时找到的东西。这里有零运行时依赖。而且我只有在调试它时才发现它不起作用。我知道在我的程序中发现逻辑缺陷不是编译器的工作,但它们肯定可以在构建程序时被控制器工厂发现吗?将所有控制器类型放入测试方法中的单元测试?或者静态代码分析或 stylecop 之类的工具?
我 googled 我想出了零。所以我的假设是我的 google 技能达不到要求。
.NET Framework 中真的没有方法来检查我的所有控制器属性加在一起是否可以正确提供服务吗?有没有办法告诉我我...弄错了?
如果真的有none,我自己写之前,是不是有什么原因?如果这是我自己写的,有什么已知的理由不应该这样做吗?
在某种程度上,存在运行时依赖性;即可能路由到相关操作的任何请求的内容。您可以通过模拟服务器和客户端生成格式正确的请求来执行自动化集成测试,并确认此处概述的预期结果:
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.1
事实证明,没有什么可以做我需要的,但是没有什么能阻止你自己做。
我写了一个不错的小库 class,我可以在单元测试中将我的控制器提供给它,它会给我一连串的错误,然后导致测试失败。
class的代码虽然是我写的,但不是我的,而是我的雇主,所以我不能在这里post,但没什么特别的,只是很多反思检查 public 方法及其参数的属性以确保它们匹配。所以是的,有可能,它没有什么特别的,如果你像我一样需要它,那就继续用通用方法 [=12] 给自己写一个整洁的小静态 class CheckCorrectUsageOfAttributes
=] 并像这样编写测试:
/// <summary>
/// Tests the account controller.
/// </summary>
[TestMethod]
public void TestAccountController()
{
// arrange
// act
var result = CheckCorrectUsageOfAttributes.ForController<AccountController>();
// assert
var first = result.FirstOrDefault();
Assert.IsNull(first, first);
}
在ASP.NET MVC中(无论版本如何,如果它很重要,假设我使用的是最新的Core 2.1)我们通过使用属性注释控制器来控制应用程序的行为和参数绑定,例如[HttpPost]
对于应该调用为 POST
的方法和 [FromQuery]
对于应该来自查询字符串的方法参数。
现在,正如我在过去几个月中艰难发现的那样,有 无数 种方法可以将其混合。例如,如果您将两个参数声明为 [FromBody]
,那么其中一个将始终是 null
,因为只有一个可以表示正文。或者,如果您的方法被标记为 [HttpGet]
,您的 [FromBody]
将返回 null
,因为标准表明它不是这样做的。相信我,犯错的方法还有很多。
我承认这些都是我的错误。如果我做对了,它就会起作用。然而,令我困惑的是,这是可以在编译时找到的东西。这里有零运行时依赖。而且我只有在调试它时才发现它不起作用。我知道在我的程序中发现逻辑缺陷不是编译器的工作,但它们肯定可以在构建程序时被控制器工厂发现吗?将所有控制器类型放入测试方法中的单元测试?或者静态代码分析或 stylecop 之类的工具?
我 googled 我想出了零。所以我的假设是我的 google 技能达不到要求。
.NET Framework 中真的没有方法来检查我的所有控制器属性加在一起是否可以正确提供服务吗?有没有办法告诉我我...弄错了?
如果真的有none,我自己写之前,是不是有什么原因?如果这是我自己写的,有什么已知的理由不应该这样做吗?
在某种程度上,存在运行时依赖性;即可能路由到相关操作的任何请求的内容。您可以通过模拟服务器和客户端生成格式正确的请求来执行自动化集成测试,并确认此处概述的预期结果:
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.1
事实证明,没有什么可以做我需要的,但是没有什么能阻止你自己做。
我写了一个不错的小库 class,我可以在单元测试中将我的控制器提供给它,它会给我一连串的错误,然后导致测试失败。
class的代码虽然是我写的,但不是我的,而是我的雇主,所以我不能在这里post,但没什么特别的,只是很多反思检查 public 方法及其参数的属性以确保它们匹配。所以是的,有可能,它没有什么特别的,如果你像我一样需要它,那就继续用通用方法 [=12] 给自己写一个整洁的小静态 class CheckCorrectUsageOfAttributes
=] 并像这样编写测试:
/// <summary>
/// Tests the account controller.
/// </summary>
[TestMethod]
public void TestAccountController()
{
// arrange
// act
var result = CheckCorrectUsageOfAttributes.ForController<AccountController>();
// assert
var first = result.FirstOrDefault();
Assert.IsNull(first, first);
}