【发布时间】:2010-11-25 21:27:16
【问题描述】:
例如这个article 介绍了他们。
有什么好处?
静态分析看起来很酷,但同时它会阻止在单元测试中将 null 作为参数传递的能力。 (如果您按照文章中的示例进行操作)
关于单元测试的话题——考虑到现在的情况,如果你已经练习过自动化测试,那么代码合同肯定没有意义吗?
更新
玩过 Code Contracts 我有点失望。例如,根据接受答案中的代码:
public double CalculateTotal(Order order)
{
Contract.Requires(order != null);
Contract.Ensures(Contract.Result<double>() >= 0);
return 2.0;
}
对于单元测试,您仍然必须编写测试以确保不能通过 null,并且如果合同是 业务逻辑,则结果大于或等于 0 >。换句话说,如果我要删除第一个合同,任何测试都不会中断,除非我专门对此功能进行了测试。然而,这是基于不使用更好(最终等)版本的 Visual Studio 中内置的静态分析。
基本上,它们都归结为编写传统 if 语句的另一种方式。我实际使用TDD, with Code Contracts 的经验说明了原因以及我是如何做到的。
【问题讨论】:
-
为什么还要写测试保证null不能通过?是因为你觉得你不能信任静态验证者吗?可能值得注意的是 order 为 null 对该方法的功能没有影响,因此我个人认为该参数的存在是一个错误。如果您实际上是在使用订单执行一些计算,那么我希望其他一些测试会因 NullReferenceException 而中断。
-
@StephenJ.Anderson +1 对
order的代码审查评论很好。
标签: unit-testing .net-4.0 code-contracts microsoft-contracts