Как выполнить модульное тестирование KeyNotFoundException без назначения значения словаря - PullRequest
0 голосов
/ 20 марта 2012

Я хочу запустить модульный тест для определенного словаря в моем коде, пытаясь получить значение, которого я не ожидаю найти в базе данных (в данном случае, ключ = 1).

Iнаписал следующий код:

    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 ]

1 голос
/ 20 марта 2012

К сожалению, в типизированном коде действительно нет способа исправить это. Вызов myDict(1) является индексатором и недопустим как утверждение (также недопустимо в C #). Чтобы проверить это, вам нужно использовать это выражение как часть юридического заявления.

Один из способов сделать это - передать значение в качестве параметра методу, который его не использует

Sub Unused(ByVal o As Object)

End Sub

...

Unused(myDict(1))
0 голосов
/ 20 марта 2012

если вы используете 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
0 голосов
/ 20 марта 2012

Похоже, я могу сделать это, поместив строку после вызова словаря, в которой используется переменная 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

Я все еще не ожидаю, что переменная будет использоваться (если тест пройден),но это имеет то преимущество, что обеспечивает дополнительную ясность для пользователя, если тест по какой-то причине проваливается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...