【发布时间】:2011-03-02 10:16:44
【问题描述】:
我只是在玩 .Net 4.0 中的代码合同,但肯定遗漏了一些明显的东西,因为它们的行为与我预期的不同。
我一直使用简单的 if...then.. throw 语句在函数开始时执行任何验证。
if (hours < 0 || hours > 8)
throw new ArgumentOutOfRangeException("hours", "Hours must be between 0 and 8");
我只是简单地将其替换为
Contract.Requires<ArgumentOutOfRangeException>(hours >= 0 && hours <= 8, "Hours must be between 0 and 8");
但它似乎从来没有在我的单元测试中引发问题。
public static DurationUnit HoursAsDuration(int hours)
{
Contract.Requires<ArgumentOutOfRangeException>(hours >= 0 && hours <= 8, "Hours must be between 0 and 8");
switch (hours)
{
case 1:
case 2:
return DurationUnit.Quarter;
case 3:
case 4:
return DurationUnit.Half;
case 5:
case 6:
return DurationUnit.ThreeQuarter;
case 7:
case 8:
return DurationUnit.Full;
default:
return DurationUnit.None;
}
}
[Test]
public void CanConvertToDuration()
{
Assert.AreEqual(DurationUnit.None, DateTimeUtility.HoursAsDuration(0));
Assert.AreEqual(DurationUnit.Quarter, DateTimeUtility.HoursAsDuration(1));
Assert.AreEqual(DurationUnit.Quarter, DateTimeUtility.HoursAsDuration(2));
Assert.AreEqual(DurationUnit.Half, DateTimeUtility.HoursAsDuration(3));
Assert.AreEqual(DurationUnit.Half, DateTimeUtility.HoursAsDuration(4));
Assert.AreEqual(DurationUnit.ThreeQuarter, DateTimeUtility.HoursAsDuration(5));
Assert.AreEqual(DurationUnit.ThreeQuarter, DateTimeUtility.HoursAsDuration(6));
Assert.AreEqual(DurationUnit.Full, DateTimeUtility.HoursAsDuration(7));
Assert.AreEqual(DurationUnit.Full, DateTimeUtility.HoursAsDuration(8));
//Would expect this to cause an issue
Assert.AreEqual(DurationUnit.None, DateTimeUtility.HoursAsDuration(9));
}
测试返回 true,但我预计代码协定会阻止“9”的值进入 switch 语句。这是预期的行为吗?
【问题讨论】:
标签: c#-4.0 nunit code-contracts