2016-06-24 57 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