2009-08-14 3 views
2

У меня есть простой модульный тест, который проверяет, что функция проверки принимает конкретную проблему проверки. Элемент validation возвращает простой объект с Item & Свойства сообщения. Я написал единичный тест для этой функции, но это всегда терпит неудачу, хотя я знаю, что функция работает так, как ожидалось.Тестирование модуля не выполняется, проверенный код работает!

<TestMethod()> Public Sub ContractNote_ValidateForManualInputTest_TradeOrderValueComparison() 

    'Can't get this test to work even though validation works! 
    Dim CN As ContractNote = New ContractNote 
    Dim Trade As New TradeOrder 

    Trade.TradeValue = 100 

    With CN 
     .CNTradeDate = Date.Today 
     .CNTradePrice = 1 
     .CNTradeUnits = 1 
     .CNTradeValue = 1 
     .FundManagerReference = "_zzz_" 
     .SkandiaCompanyOrderID = "xxx" 
     .ParentTradeOrder = Trade 
    End With 

    Dim ActualItems As System.Collections.Generic.List(Of ValidationItem) =  CN.ValidateForManualInput 

    If actualitems.Count > 0 Then    
     Dim item As ValidationItem = New ValidationItem("Value", "Must match trade value") 
     CollectionAssert.Contains(ActualItems, item, "") 
    End If 

    Assert.AreNotEqual(0, ActualItems.Count) 

End Sub 

Я реализовал IComparable на ValidationItem (у меня есть отдельный модульный тест, который подтверждает это работает). Правильно ли я использую CollectionAssert?

+0

Оберните попытку поймать и посмотрите, есть ли у вас какие-либо ошибки. – epitka

+0

Неудача на CollectionAssert.Contains или Assert.AreNotEqual? – Joseph

ответ

2

The MSDN doc for CollectionAssert.Contains(collection,element,message) говорит:

Проверяется, что указанный набор содержит указанный элемент. Утверждение не выполняется, если элемент не является , найденным в коллекции. Отображает сообщение , если утверждение не выполнено.

Предполагая, что CN.ValidateForManualInput возвращает список ValidationItems в ActualItems, позвольте мне называть эти пункты "A", "B" и "C" на мгновение.

Далее вы создаете новый ValidationItem, создавая его с помощью «Значение» и «Должно соответствовать стоимости торговли». Позвольте мне называть это новое ValidationItem «D» на мгновение.

Я думаю, что ваша проблема может быть, что ваш призыв к CollectionAssert.Contains() эффективно говорит:

Утверждай, что D находится в списке, который имеет только 3 пунктов в нем, A, B и C .

Но это не так, поэтому тест терпит неудачу.

Что, если вместо CollectionInsert.Contains(), вы петлевой по всем пунктам в ActualItems и проверить каждый что-то вроде:.

Assert (ActualItems[ii].message is Not "Must match trade value") 

(Это может быть не точный синтаксис VB Я обычно пишу C# .)

+0

Спасибо, но верно это работает до тех пор, пока в коллекции есть только один элемент? В противном случае вы не утверждаете, что ВСЕ элементы имеют соответствующее сообщение? – Simon

+0

Это не вопрос наличия соответствующего сообщения. Он ищет * конкретный * экземпляр вашего объекта сообщения. Подумайте об этом так: представьте, что A, B, C и D в моем ответе выше - это фунтовые заметки. Возьмите ручку и напишите X на фунтовой ноте D. Утверждение «Содержит (D)» не спрашивает: «Есть ли * нота в фунте в списке, который содержит A, B и C?» Но скорее: «Это * конкретная * фунтовая заметка (та, которую вы написали X в списке)?» Ответ - нет, поэтому Contains() возвращает false. Яснее? – JeffH

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