单元测试失败,测试代码有效!

时间:2009-08-14 15:26:13

标签: .net vb.net unit-testing

我有一个简单的单元测试,它测试验证函数是否会引发特定的验证问题。验证项返回一个带有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

我在ValidationItem上实现了IComparable(我有一个单独的单元测试,证实了这一点)。我是否正确使用CollectionAssert?

1 个答案:

答案 0 :(得分:2)

MSDN doc for CollectionAssert.Contains(collection,element,message)说:

  

验证指定的集合   包含指定的元素。该   如果元素不是,则断言失败   在该系列中找到。显示一个   如果断言失败,则显示消息。

假设CN.ValidateForManualInput在ActualItems中返回ValidationItems列表,让我暂时将这些项目称为“A”,“B”和“C”。

接下来,您创建一个新的ValidationItem,使用“Value”和“Must match trade value”构建它。我暂时将这个新的ValidationItem称为“D”。

我认为您的问题可能是您对CollectionAssert.Contains()的调用有效地说:

  

断言D在列表中   只有3个项目,A,B和C.

但事实并非如此,所以测试失败了。

如果,而不是CollectionInsert.Contains(),你循环遍历ActualItems中的所有项目,并检查每个项目如下:

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

(这可能不是精确的VB语法。我通常会编写C#。)