你需要創建一個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聽起來合理 –