【问题标题】:Unit test fails, tested code works!单元测试失败,测试代码有效!
【发布时间】:2010-11-19 16:41:00
【问题描述】:

我有一个简单的单元测试,用于测试验证函数是否发现了特定的验证问题。验证项返回一个带有 Item & Message 属性的简单对象。我已经为此函数编写了一个单元测试,但即使我知道该函数按预期工作,它总是失败。

<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?

【问题讨论】:

  • 包裹在try catch中看看有没有错误。
  • CollectionAssert.Contains 或 Assert.AreNotEqual 是否失败?

标签: .net vb.net unit-testing


【解决方案1】:

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#。)

【讨论】:

  • 谢谢,但只要集合中只有一项,这肯定有效吗?否则你不是断言所有项目都有匹配的消息吗?
  • 这不是匹配消息的问题。它正在寻找您的消息对象的 specific 实例。可以这样想:想象我上面的答案中的 A、B、C 和 D 是英镑纸币。拿一支笔在英镑纸币 D 上写一个 X。语句“包含 (D)”不会问:“列表中是否有 a 英镑纸币包含 A、B 和 C? "而是:“这是列表中的特定磅纸币(您在上面写了X的纸币)吗?”答案是否定的,所以 Contains() 返回 false。更清楚了吗?
猜你喜欢
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多