2012-11-28 157 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