2016-06-24 85 views
1

我有以下類的單元測試:創建泛型方法

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) && (value.CompareTo(Maximum) <= 0); 
    } 

} 

我使用的xUnit創建我的單元測試...

我應該如何測試包含具有T法?

+1

有多少你應該測試你的班級,我認爲這將是足夠的,如果你測試你的班級單一類型,實現'IComparable '例如'int',測試'int'的所有邊界情況,並假定它可以和其他'IComparables '完成。 – csharpfolk

+1

如果你的類對所有'T'(它應該)是一致的,那麼你可以爲測試用例提供一個特定的'T'(例如'int')。 – Lee

+0

@csharpfolk聽起來合理 –

回答

4

正如已經指出,你可以用一個int測試它可能是這個樣子:

var range = new Range<int>(minimum: 3, maximum: 7); 
Assert.IsTrue(range.Contains(5)); 
1

你需要創建一個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被稱爲能力。

快樂編碼!

+1

或者像chandler聲明使用實現IComparable的內置對象,如int,這很簡單,您可以信任Int32.CompareTo(int值)。我的意思是如果你喜歡可讀的測試和所有;) – TwistedStem