为泛型方法创建单元测试

本文关键字:单元测试 创建 泛型方法 | 更新日期: 2023-09-27 17:49:18

我有以下类:

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的Contains方法?

为泛型方法创建单元测试

如前所述,您可以使用int来测试它,它可能看起来像这样:

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

您需要创建一个icomcomparable的实例,并且为了彻底(真正的单元测试),我建议使用具有验证调用能力的mock库。我可能会用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);
  }
}

最终结果是相同的,但它使设置模拟时更容易一些。或者你可以选择价值。比较两个方面。无论哪种方式都会增加一点一致性。

测试代码看起来像这样:

  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类的Contains方法,而不是对象的能力返回正确的值当它的CompareTo被调用

编码快乐!