簡體   English   中英

創建通用方法的單元測試

[英]Create an Unit Test for Generic Method

我有以下課程:

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

您需要創建一個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));

現在,您正在測試Range類的Contains方法,而不是對象在調用CompareTo時返回正確值的能力。

編碼愉快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM