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

Как уже было сказано, вы можете проверить его с междунар который может выглядеть примерно так:

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

Вам нужно создать экземпляр IComparable и для тщательности (истинного модульного тестирования), я хотел бы предложить издевательская библиотека с возможностью проверки звонков. Я бы, вероятно, использовал что-то вроде Мока. Вам понадобится объект, который реализует интерфейс, который у вас уже есть, или вы можете создать тестовый, без фактической реализации.

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)); 

Теперь вы проверяете ваш класс Range содержит метод, а не способность объекта, чтобы вернуть правильное значение, когда это CompareTo называется.

Счастливое кодирование!

+1

Или, как сказал Чандлер, встроенный объект, который реализует IComparable, например int, который является простым, и вы можете доверять Int32.CompareTo (значение int). Я имею в виду, если вам нравятся читаемые тесты и все;) – TwistedStem

Смежные вопросы