Модульный тест завершается неудачно с ожидаемым InvalidOperationException - PullRequest
0 голосов
/ 05 апреля 2019

Я написал модульный тест для проверки некоторых операций SQL в моем приложении. Вот тест:

[TestMethod]
[ExpectedExceptionAttribute(typeof(InvalidOperationException))]
public void ExecuteSQL_CommandInvalidSyntax_ThrowsException()
{
    var result = TestSqlHandler.ExecuteSQL(new List<int>
    {
        1, 2, 3, 4
    }, "Invalid command text");
}

Метод, о котором идет речь:

public static Exception ExecuteSQL(List<int> walletList, string command)
{
    try
    {
        using (var conn = new SqlConnection("Omitted"))
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();


            string sql = command;
            using (var cmd = new SqlCommand(sql, conn))
            {
                conn.Open();
                foreach (int row in walletList)
                {
                    cmd.Parameters.AddWithValue("@par1", row.ToString());
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                conn.Close();
            }
        }
    }
    catch (Exception ex)
    {
        return ex;
    }
    return null;
}

Однако этот тест завершается неудачно, если я изменяю метод на утверждение равенства возвращаемого значения и исключения InvalidOperationException, и мне выдается следующее сообщение:

Сообщение: сбой Assert.AreEqual. Ожидается: System.InvalidOperationException: операция недопустима из-за текущего состояния объекта. Факт: System.InvalidOperationException: ExecuteNonQuery: свойство CommandText не было инициализировано

Я также продублировал код в отдельный файл проекта, чтобы вызываемый метод возвращал исключение InvalidOperationException, и это происходит. Чего мне не хватает?

1 Ответ

1 голос
/ 05 апреля 2019

Ваш метод - , возвращающий исключение, а не , выдающий исключение.ExpectedExceptionAttribute ожидает, что ваш метод вызовет необработанное исключение.Эта строка:

return ex;

возвращает исключение.Вместо этого просто замените его на

throw;

или полностью удалите попытку / поймать, так как ловить и ничего не делать, кроме отбрасывания, это то же самое, что не ловить его в первую очередь.

I 'Также спросите, имеет ли смысл возвращать функцию Exception.

public static Exception ExecuteSQL(List<int> walletList, string command)

Это действительно то, что вы хотите, или он должен вернуть результат выполнения запроса?Функция должна возвращать то, что вы ожидаете получить , возможно, в этом случае значение из запроса или ответ, указывающий, что он был выполнен.Вам не нужно возвращать исключение.Если его бросают, он автоматически попадает в вызывающий метод.Этот метод может обрабатывать его, а если нет, то всплывает до следующего метода и т. Д.


Это также объясняет ошибку, которую вы получаете, если вы измените тест для утверждения равенства.Независимо от того, какое возвращаемое значение вы ожидаете, вы проверяете, равно ли оно Exception.

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