你需要创建一个IComparable接口的和彻底性(真正的单元测试)的情况下我会建议一个能够验证呼叫的模拟库。我可能会使用像Moq这样的东西。您将需要一个实现该接口的对象,您可能已经创建了该接口,或者可以创建一个没有实际实现的测试。
public class YourObject : IComparable<YourObject>
{
public virtual int CompareTo(YourObject other)
{
throw new NotImplementedException();
}
}
我会做一个微妙的变化,你的范围代码只是一个位的一致性:
public class Range<T> where T : IComparable<T>
{
public T Minimum { get; set; }
public T Maximum { get; set; }
public Range(T minimum, T maximum)
{
Minimum = minimum;
Maximum = maximum;
}
public Boolean Contains(T value)
{
return (Minimum.CompareTo(value) <= 0) && (Maximum.CompareTo(value) >= 0);
}
}
最终的结果是相同的,但它使事情变得更简单,同时建立嘲笑。或者你可以在两个帐户上使用value.CompareTo。无论哪种方式,它会增加一点点的一致性。
测试代码看起来有点像这样:
var min = new Mock<YourObject>();
var max = new Mock<YourObject>();
var val = new Mock<YourObject>();
var range = new Range<YourObject>(min.Object, max.Object);
min.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(-1);
max.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(1);
Assert.True(range.Contains(val.Object));
min.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(0);
max.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(1);
Assert.True(range.Contains(val.Object));
min.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(-1);
max.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(0);
Assert.True(range.Contains(val.Object));
min.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(1);
max.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(1);
Assert.False(range.Contains(val.Object));
min.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(-1);
max.Setup(m => m.CompareTo(It.IsAny<YourObject>())).Returns(-1);
Assert.False(range.Contains(val.Object));
现在你正在测试范围类的包含方法,而不是对象的返回正确的值时,它的CompareTo被称为能力。
快乐编码!
有多少你应该测试你的班级,我认为这将是足够的,如果你测试你的班级单一类型,实现'IComparable'例如'int',测试'int'的所有边界情况,并假定它可以和其他'IComparables '完成。 –
csharpfolk
如果你的类对所有'T'(它应该)是一致的,那么你可以为测试用例提供一个特定的'T'(例如'int')。 – Lee
@csharpfolk听起来合理 –