2012-01-05 18 views
2

Я работаю в лаборатории, практичной с модульным тестированием, а ниже - часть кода из приложения, которое я тестирую. Большинство тестов единицы завершены, но в отношении конструктора ниже я просто не могу понять, как его проверить. Например, что именно делает конструктор с элементами массива? Что было бы хорошим способом тестирования конструктора?Unit-testing конструктора

Может быть, какая-то добродушная душа, которая может дать мне удар в правильном направлении?

public struct Point { 
    public int x, y; 

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

...

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

...

 [TestMethod()] 
     public void TriangleConstructorTest1() 
     { 
      Point[] s = null; // TODO: Initialize to an appropriate value 
      Triangle target = new Triangle(s); 
      Assert.Inconclusive("TODO: Implement code to verify target"); 
     } 
+0

Вы уверены, что вам нужно было также проверить конструктор? Мне кажется бессмысленным, поскольку вы выполняете только некоторые задания. – Tudor

+0

Является ли «стороны» выставлены каким-либо образом? Каковы общедоступные свойства «Треугольника»? –

+1

@ Tudor: На самом деле я склонен не согласиться. Поскольку он выполняет задания, он, вероятно, должен быть проверен модулем, чтобы удостовериться, что он назначает ожидаемое. Но это всего лишь мои 0,02 доллара, и каждый рассматривает модульное тестирование по-разному. –

ответ

3

Вы говорите о конструкторе Traingle, не так ли?

Похоже, что используется для вычисления длины сторон треугольника, используя Pythagorean theorem.
Итак, вы должны проверить, правильно ли выполняется этот расчет.

Кроме того, вы можете проверить, обнаружен ли конструктор неверными аргументами, например.:

[TestMethod] 
[ExpectedException(typeof(ArgumentNullException))] 
public void Cannot_Create_Passing_Null() 
{ 
    new Triangle(null); 
} 
[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void Cannot_With_Less_Than_Three_Points() 
{ 
    new Triangle(new[] { new Point(0, 0), new Point(1, 1) }); 
} 
[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void Cannot_Create_With_More_Than_Three_Points() 
{ 
    new Triangle(new[] { new Point(0, 0), new Point(1, 1), new Point(2, 2), new Point(3, 3) }); 
} 
[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void Cannot_Create_With_Two_Identical_Points() 
{ 
    new Triangle(new[] { new Point(0, 0), new Point(0, 0), new Point(1, 1) }); 
} 
[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void Cannot_Create_With_Empty_Array() 
{ 
    new Triangle(new Point[] { }); 
} 
1

Я предполагаю, что у вас есть Sides свойство, можно утверждать, что значения, возвращаемые из этого то, что они должны быть ,

Возможно, вы также захотите реорганизовать свой код немного, так как для меня это похоже на то, что эти три строки почти идентичны, но с разными параметрами Point.

Кроме того, созданный вами конструктор не совпадает с конструктором в вашем примере теста.

+0

Да, я полагаю, мне следовало бы это сделать (утверждать, что возвращаемые значения - это то, что они должны быть). Но как я могу вернуть их в этом случае методу тестирования, чтобы я мог их проверить? – holyredbeard

4

Возможно, мне что-то не хватает, но разве это не так?

[TestMethod()] 
     public void PointConstructorTest1() 
     { 
      Point target = new Point(1.5, 2.0); 
      Assert.AreEqual(1.5, target.x); 
      Assert.AreEqual(2.0, target.y); 
     } 

Не много смысла в тестировании переменного присвоения, хотя на самом деле ....

+2

На самом деле я нахожу большую ценность при назначении тестирования. Если внутреннее представление меняется и т. Д., Хорошо знать, что это изменение не нарушило существующие тесты. Таким образом, я склонен писать модульные тесты для всех моих конструкторов и даже простых свойств, но опять же это всего лишь мои $ 0.02 –

+1

. Это хороший модульный тест для точки, я думаю, он спрашивал, как модулю тестировать конструктор треугольника, в частности. –

3

Трудно ответить на основе некоторых несоответствий в первоначальном вопросе, но я пойду на основе коды конструктора, а не ваш образец контрольная работа.

Прежде всего, я бы опробовал массив точек < 3 или> 3, и вы выбрали соответствующее исключение (которое вы должны проверить и выбросить в свой конструктор).

Во-первых, я должен был бы ваш конструктор броска, если массив точек плохо:

public Triangle(Point[] s) 
    { 
     // you could use more specific ArgumentNullException for first, 
     // IllegalOperationException for second, etc, you get the point 
     // (no pun intended). 
     if (s== null || s.Length != 3 || s.Any(x => x == null)) 
      throw new ArgumentException("s"); 
     ... 
    } 

Тогда, я бы проверить для нулевого или некорректной длины

[TestMethod] 
    [ExpectedException(typeof(ArgumentException))] 
    public void TriangleConstructorWithNullPoints() 
    { 
     Point[] s = null; 
     Triangle target = new Triangle(s); 
    } 

[TestMethod]        
[ExpectedException(typeof(ArgumentException))]        
public void TriangleConstructorWithFourPoints()        
{ 
    Point[] s = new Point[4]; 
    Triangle target = new Triangle(s);        
} 

Тогда Я бы проверил общий случай. Возьмите 3/4/5 треугольник, например:

[TestMethod] 
public void TriangleConstructorWithFourPoints() 
{ 
    Point[] s = new [] 
    { 
     new Point { x = 0, y = 0 }, 
     new Point { x = 4, y = 0 }, 
     new Point { x = 4, y = 3 } 
    }; 

    Triangle target = new Triangle(s); 

    Assert.IsTrue(target.Sides.Contains(3.0)); 
    Assert.IsTrue(target.Sides.Contains(4.0)); 
    Assert.IsTrue(target.Sides.Contains(5.0)); 
} 

Тогда я проверить любые краевые условия, как массив длины 3, но одна из точек в массиве равно нулю, (проверьте соответствующий исключение) или если любые две точки одинаковы, и так далее.

1

Я хотел бы начать говорить, что если вы будете следовать recommendations из Eric Lippert, то вы не хотите иметь изменяемые структуры. Теперь, если вы находитесь на стороне state verification в качестве проблем с Unit Testing, вы должны сделать вывод, что нет смысла тестировать неизменяемые объекты, поскольку они могут иметь только одно состояние. Лучший случай, вы можете добиться всего того, что конструктор не сделал что-то вроде this.x = b.

Смежные вопросы