在ASP.NET MVC中(无论版本如何,如果它很重要,假设我使用的是最新的Core 2.1),我们通过使用属性注释控制器来控制应用程序的行为和参数绑定,例如[HttpPost]
对于应该被称为POST
和[FromQuery]
的方法,对于应该来自查询字符串的方法参数。
现在我已经发现了过去几个月的艰难方式,有无数的方法可以将其混合起来。例如,如果您将两个参数声明为[FromBody]
,则其中一个将始终为null
,因为只有一个可以表示正文。或者,如果您的方法标有[HttpGet]
,则[FromBody]
会null
返回ICollection<T>
,因为标准表示不是这样做的。相信我,还有很多方法可以解决它。
我接受这些都是我的错误。如果我做得正确,它会起作用。但是,令我感到困惑的是,这可以在编译时找到 。此处没有运行时依赖性。我只是在调试它时发现它并不起作用。我知道在我的程序中找到逻辑缺陷不是编译器的工作,但是在构建它时,控制器工厂肯定可以找到它们吗?我将所有控制器类型都抛入测试方法的单元测试?还是像静态代码分析或stylecop这样的工具?
我用Google搜索,我想出了零。所以我的假设是我的谷歌技能不符合它。.NET Framework中是否真的没有方法来检查我的所有控制器属性是否与可以正确提供的内容相加?有没有办法告诉我,我...那个混了吗?
如果确实没有,在我自己写之前,这是有原因的吗?如果我自己写这个是否有任何已知原因,为什么不应该这样做?
答案 0 :(得分:1)
在某种程度上,存在运行时依赖性;即可能被路由到相关操作的任何请求的内容。您可以通过模拟服务器和客户端生成格式良好的请求并确认预期结果来执行自动集成测试,如下所示:
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.1
答案 1 :(得分:0)
事实证明,没有什么可以做我需要的,但是没有什么可以阻止您自己做。
我写了一个不错的小类库,可以在单元测试中将控制器提供给我,它会给我带来一系列错误,然后使测试失败。
由我编写的类代码不是我的,而是我的老板,所以我不能在这里发布它,但这没什么特别的,只是对公共方法及其参数进行了大量的反射检查属性,以确保他们匹配。所以是的,有可能没有什么特别的,如果您像我一样需要它,只需继续使用通用方法CheckCorrectUsageOfAttributes
编写一个整洁的静态小类ForController
并编写测试是这样的:
/// <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);
}