0

我希望在我的代码中对特定字典运行单元测试,试图获得一个我不希望出现在数据库中的值(在这种情况下,key=1)。

我写了以下代码:

    Try
        Dim s As String = myDict(1)
    Catch ex As KeyNotFoundException
        Assert.AreEqual("The given key was not present in the dictionary.", ex.Message)
    Catch ex As Exception
        Assert.Fail()
        Throw
    End Try

这工作正常,但代码分析抱怨“Dim s as String”声明,因为它说 s 永远不会用于任何事情。那是故意的,因为我打算为此抛出异常,而 s 是无关紧要的。

但是,我似乎找不到从代码中消除 s 的方法。只需删除分配:

    Try
        myDict(1)
    Catch ex As KeyNotFoundException
        Assert.AreEqual("The given key was not present in the dictionary.", ex.Message)
    Catch ex As Exception
        Assert.Fail()
        Throw
    End Try

现在无法编译。关于如何做到这一点的任何建议?

4

3 回答 3

1

不幸的是,在类型化代码中确实没有办法解决这个问题。该调用myDict(1)是一个索引器,它作为语句是不合法的(在 C# 中也是非法的)。为了对此进行测试,您需要将此表达式用作法律声明的一部分。

实现此目的的一种方法是将值作为参数传递给不使用它的方法

Sub Unused(ByVal o As Object)

End Sub

...

Unused(myDict(1))
于 2012-03-20T16:09:44.850 回答
0

看起来我可以通过在使用 s 变量的字典调用之后放置一行来做到这一点:

    Try
        Dim s As String = theDocumentsWithUserNameDictDto.Dict(1)
        Assert.Fail("Found unexpected value for dictionary key 1: " & s)
    Catch ex As KeyNotFoundException
        Assert.AreEqual("The given key was not present in the dictionary.", ex.Message)
    End Try

我仍然不希望使用该变量(如果测试通过),但这确实有利于在测试由于某种原因失败时为用户提供额外的清晰度。

于 2012-03-20T16:51:30.247 回答
0

如果您使用的是 NUnit 框架

您可以使用以下代码

  Dim f As Func(Of Integer, String) = Function(i) myDict.Item(i)
  Dim a As TestDelegate = Function() f(1)
  Dim ex As KeyNotFoundException = Assert.Throws(Of KeyNotFoundException)(a)
  Assert.AreEqual("The given key was not present in the dictionary.", ex.Message)

这是 JaredPar 提出的类似解决方案

另一种选择是让测试返回一个值并使用该ExpectedException属性,因此代码可能如下所示:

<TestCase(New Object(0  - 1) {}, Result:=Nothing), ExpectedException(GetType(KeyNotFoundException), ExpectedMessage:="The given key was not present in the dictionary."), Test> _
Public Function MyTest() As String
  Return myDict.Item(1)
End Function
于 2012-03-20T16:52:57.137 回答