我希望在我的代码中对特定字典运行单元测试,尝试获取一个我不希望在数据库中的值(在这种情况下,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
现在无法编译。有关如何做到这一点的任何建议吗?
答案 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