2014-05-01 70 views
4

我的單元測試失敗的消息是:xunit.net - 雙[,]比較

Result Message: 
Assert.Equal() Failure 
Position: First difference is at position 0 
Expected: Double[,] { 0,888888888888889, 1,33333333333333, 1,33333333333333, 2,66666666666667 } 
Actual: Double[,] { 0,888888888888889, 1,33333333333333, 1,33333333333333, 2,66666666666667 } 

我知道,如果你比較雙號則必須指定精度,所以我的解決方法是:

Assert.Equal(_sA.ToArray(), result.ToArray(), new Comparer()); 

class Comparer : IEqualityComparer<double[,]> 
{ 
    public bool Equals(double[,] x, double[,] y) 
    { 
     if (x.GetLength(0) != y.GetLength(0) || x.GetLength(1) != y.GetLength(1)) 
      return false; 

     for (var i = 0; i < x.GetLength(0); ++i) 
     { 
      for(var j = 0; j < x.GetLength(1); ++j) 
      if (!isEqual(x[i, j], y[i, j])) 
       return false; 
     } 

     return true; 
    } 

    private bool isEqual(double x, double y) 
    { 
     const double epsilon = 1e-5; 
     return Math.Abs(x - y) <= epsilon * Math.Abs(x); 
    } 
} 

有沒有更好,更簡單的解決方案?

+0

不會如果x爲零,工作帶來極大的:) – Benjol

回答

0

從代碼庫的xUnit

/// <summary> 
/// Verifies that two <see cref="T:System.Double" /> values are equal, within the number of decimal 
/// places given by <paramref name="precision" />. 
/// </summary> 
/// <param name="expected">The expected value</param> 
/// <param name="actual">The value to be compared against</param> 
/// <param name="precision">The number of decimal places (valid values: 0-15)</param> 
/// <exception cref="T:Xunit.Sdk.EqualException">Thrown when the values are not equal</exception> 
public static void Equal(double expected, double actual, int precision)