.net 单元测试失败,测试代码正常!

.net 单元测试失败,测试代码正常!,.net,vb.net,unit-testing,.net,Vb.net,Unit Testing,我有一个简单的单元测试,它测试一个验证函数是否处理了一个特定的验证问题。验证项返回具有项和消息属性的简单对象。我已经为这个函数编写了一个单元测试,但是它总是失败,即使我知道这个函数按预期工作 <TestMethod()> Public Sub ContractNote_ValidateForManualInputTest_TradeOrderValueComparison() 'Can't get this test to work even though validati

我有一个简单的单元测试,它测试一个验证函数是否处理了一个特定的验证问题。验证项返回具有项和消息属性的简单对象。我已经为这个函数编写了一个单元测试,但是它总是失败,即使我知道这个函数按预期工作

<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
公共分包合同注释\u ValidateForManualInputTest\u TradeOrderValueComparison()
'即使验证工作正常,也无法使此测试工作!
作为合同注释的尺寸CN=新合同注释
作为新贸易秩序的暗淡贸易
Trade.TradeValue=100
与CN
.CNTradeDate=日期。今天
.CNTradePrice=1
.CNTradeUnits=1
.CNTradeValue=1
.FundManagerReference=“zzz_zz”
.SkandiaCompanyOrderID=“xxx”
.ParentTradeOrder=Trade
以
Dim实现项作为System.Collections.Generic.List(Of ValidationItem)=CN.ValidateForManualInput
如果实现项计数>0,则
作为ValidationItem的Dim项目=新的ValidationItem(“值”,“必须与交易值匹配”)
CollectionAssert.Contains(实现项,项“”)
如果结束
Assert.AreNotEqual(0,实现项数)
端接头
我已经在ValidationItem上实现了IComparable(我有一个单独的单元测试来确认这一点)。我是否正确使用CollectionAssert?

屏幕上显示:

验证指定的集合是否正确 包含指定的元素。这个 如果元素不存在,则断言失败 在收藏中找到。显示 如果断言失败,则返回消息

假设CN.ValidateForManualInput在实现项中返回一个ValidationItems列表,让我暂时将这些项称为“a”、“B”和“C”

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

我认为您的问题可能是您对CollectionAssert.Contains()的调用实际上表明:

断言D在具有 其中只有3项,A、B和C

但事实并非如此,因此测试失败

如果不是CollectionSert.Contains(),而是循环实现项中的所有项,并使用以下内容检查每个项,该怎么办

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

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

使用try-catch,看看是否有任何错误。CollectionAssert.Contains或Assert.AreNotEqual是否失败?谢谢,但只要集合中只有一个项,这种方法肯定有效?否则,您不认为所有项目都有匹配的消息吗?这不是有匹配消息的问题。它正在查找消息对象的特定实例。这样想:想象一下,我上面的答案中的A、B、C和D都是英镑。拿支笔在英镑纸币D上写一个X。语句“Contains(D)”不会问:“列表中是否有一张英镑纸币包含a、B和C?”而是问:“这个特定的英镑纸币(你在上面写X的那张)在列表中吗?”答案是否,因此Contains()返回false。更清楚?