如何在不指定字典值的情况下对KeyNotFoundException进行单元测试

时间:2012-03-20 16:07:49

标签: vb.net unit-testing dictionary keynotfoundexception

我希望在我的代码中对特定字典运行单元测试,尝试获取一个我不希望在数据库中的值(在这种情况下,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

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

3 个答案:

答案 0 :(得分:1)

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

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

Sub Unused(ByVal o As Object)

End Sub

...

Unused(myDict(1))

答案 1 :(得分: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

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

答案 2 :(得分:0)

如果您使用的是NUnit Framework而不是

您可以使用以下代码

  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