如何为Nunit CollectionAssert测试创建IComparer?

Ahm*_*mad 9 c# nunit

我希望在NUnit中为以下场景创建以下测试:我们希望测试正在创建的新计算方法产生类似于旧系统的结果.所有值之间的可接受差异(或者更确切地说是重新定义)已被定义为

 abs(old_val - new_val) < 0.0001
Run Code Online (Sandbox Code Playgroud)

我知道我可以循环遍历新列表中的每个值,并与旧列表中的值进行比较并测试上述条件.

如何使用Nunit的CollectionAssert.AreEqual方法(或某种CollectionAssert方法)实现这一目标?

Seb*_*zus 8

目前的答案已经过时.从NUnit 2.5开始,有一个重载CollectionAssert.AreEqual,需要一个System.Collections.IComparer.

这是一个最小的实现:

public class Comparer : System.Collections.IComparer
{
  private readonly double _epsilon;

  public Comparer(double epsilon)
  {
    _epsilon = epsilon;
  }

  public int Compare(object x, object y)
  {
    var a = (double)x;
    var b = (double)y;

    double delta = System.Math.Abs(a - b);
    if (delta < _epsilon)
    {
      return 0;
    }
    return a.CompareTo(b);
  }
}


[NUnit.Framework.Test]
public void MyTest()
{
  var a = ...
  var b = ...
  NUnit.Framework.CollectionAssert.AreEqual(a, b, new Comparer(0.0001));
}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*mad 6

那么NUnit框架中的方法允许我对集合进行容差检查.请参阅Equal Constraint.一个使用AsCollectionWithin扩展方法.在这方面,虽然我对这一陈述的含义并非100%肯定

如果要将要比较的数组视为简单集合,请使用AsCollection修饰符,这将导致逐个元素地进行比较,而不考虑数组的等级或维度.

 [Test]
 //[ExpectedException()]
 public void CheckLists_FailsAt0()
 {
    var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
    var result1 = new[] { -0.0004, 0.43520, 1.3454, 345345.0980 };
    Assert.That(result1, Is.EqualTo(expected).AsCollection.Within(0.0001), "fail at [0]"); // fail on [0]    
    }

[Test]
//[ExpectedException()]
public void CheckLists_FailAt1()
{
    var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
    var result1a = new[] {  0.0001000000 , 0.4348245000 , 1.3450234000 , 345345.0975980000  };                      
    Assert.That(result1a, Is.EqualTo(expected).AsCollection.Within(0.0001), "fail at [1]"); // fail on [3]        
    }

[Test]    
public void CheckLists_AllPass_ForNegativeDiff_of_1over10001()
{
    var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
    var result2 = new[] {  0.00009900 , 0.43532350 , 1.34552240 , 345345.09809700 };
    Assert.That(result2, Is.EqualTo(expected).AsCollection.Within(0.0001)); // pass      
 }

 [Test]
 public void CheckLists_StillPass_ForPositiveDiff_of_1over10001()
 {
    var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
    var result3 = new[] {  0.00010100 ,  0.43532550  , 1.34552440 , 345345.09809900 };
    Assert.That(result3, Is.EqualTo(expected).AsCollection.Within(0.0001)); // pass
 }
Run Code Online (Sandbox Code Playgroud)