2012-11-28 227 views
-1

我正在爲這個類進行單元測試,這是一個三角形類,它取兩邊並確定三角形是否是斜角,等腰或等邊。在C#中的單元測試Visual Studio

public struct Point 
{ 
    public int x, y; 

    public Point(int a, int b) 
    { 
     x = a; 
     y = b; 
    } 
} 

public class Triangle 
{ 
    double[] sides; 

    public Triangle(double a, double b, double c) 
    { 
     if ((a <= 0) || (b <= 0) || (c <= 0)) 
     { 
      throw new ArgumentException(" "); 
     } 
     sides = new double[] { a, b, c }; 
    } 

    public Triangle(double[] s) 
    { 
     sides = new double[s.Length]; 
     for (int i = 0; i < s.Length; i++) 
      sides[i] = s[i]; 
    } 

    public Triangle(Point a, Point b, Point c) 
    { 
     sides = new double[3]; 
     sides[0] = Math.Sqrt(Math.Pow((double)(b.x - a.x), 2.0) + Math.Pow((double)(b.y - a.y), 2.0)); 
     sides[1] = Math.Sqrt(Math.Pow((double)(b.x - c.x), 2.0) + Math.Pow((double)(b.x - a.x), 2.0)); 
     sides[2] = Math.Sqrt(Math.Pow((double)(c.x - a.x), 2.0) + Math.Pow((double)(c.x - a.x), 2.0)); 
    } 

    public Triangle(Point[] s) 
    { 
     sides = new double[s.Length]; 
     sides[0] = Math.Sqrt(Math.Pow((double)(s[1].x - s[0].x), 2.0) + Math.Pow((double)(s[1].y - s[0].y), 2.0)); 
     sides[1] = Math.Sqrt(Math.Pow((double)(s[1].x - s[2].x), 2.0) + Math.Pow((double)(s[1].x - s[2].x), 2.0)); 
     sides[2] = Math.Sqrt(Math.Pow((double)(s[2].x - s[0].x), 2.0) + Math.Pow((double)(s[2].x - s[0].x), 2.0)); 
    } 

    private int uniqueSides() 
    { 
     return sides.Distinct<double>().Count(); 
    } 

    public bool isScalene() 
    { 
     if (uniqueSides() == 1) 
      return true; 
     return false; 
    } 

    public bool isEquilateral() 
    { 
     if (uniqueSides() == 3) 
      return true; 
     return false; 
    } 

    public bool isIsosceles() 
    { 
     if (uniqueSides() == 2) 
      return true; 
     return false; 
    } 
} 

}

的isScaleneTest失敗了,我想不通爲什麼?

[TestMethod()] 
    public void isScaleneTest() 
    { 
     Triangle target = new Triangle(1.2, 2.1, 7.1); 
     Assert.IsTrue(target.isScalene()); 
    } 

我也有問題搞清楚如何測試其他方法。 isEquilateral和isIsosceles已經過測試並通過,但我無法通過任何其他測試。有任何想法嗎?有什麼要測試構造函數嗎?感謝幫助。

+3

您是否使用調試器完成了測試? –

+0

未與單元測試連接,但傳遞給構造函數的三個長度不會形成三角形。任何雙方的總和必須多於三分之一。 – SWeko

回答

1

不等邊三角形有三條邊是所有不平等。爲isScalene的代碼應該是:

public bool isScalene() 
{ 
    if (uniqueSides() == 3) 
     return true; 
    return false; 
} 

而且,代碼是isEquilateral是錯誤的。一個等邊三角形有三個等於兩邊,所以對於等邊三角形uniqueSides的回報應該是1副3。

+0

當然!謝謝! – ana

1

您的代碼sides.Distinct<double>().Count();正在返回超過1

看一看這個線程,

Distinct not working with LINQ to Objects

LINQ鮮明的是沒有那麼聰明,當涉及到自定義對象。

它所做的只是查看您的列表,並看到它有兩個不同的對象(它們並不在意它們對於成員 字段具有相同的值)。

爲鏈接顯示,你可以實現IEquatable

+0

他對'Distinct'的使用與'double'副自定義對象。在他的情況下,它使用'double'的默認相等比較器。這可能仍然會導致問題,但是現在沒有通過的測試是由於他如何測試縮放三角形。 –

+0

-1。在雙打上差別很大(並且無論如何都不可能實現IEquatable的'double'),問題出在Scalene和Equilateral的定義上。 – SWeko