модульное тестирование неожиданного исключения? - PullRequest
0 голосов
/ 25 октября 2011

Можно ли провести макет или юнит-тест на неожиданное исключение? Покрытие кода жалуется, что улов не проверяется, но как вы его проверяете?

    public List<Blog> SelectActiveBlogs()
    {
        List<Blog> returnCode = null;

        try
        {
            returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList();
        }
        catch (Exception ex)
        {
            ExceptionHandler.HandleException(ex);
        }

        return returnCode;
    }

РЕДАКТИРОВАТЬ: GetQueryable - это метод, который использует фабрику хранилища для получения результата БД, поэтому могут возникать исключения, возникающие из-за взаимодействий БД в производстве, поэтому я хочу убедиться, что мы их поймаем, если что-то идет не так, поэтому блок catch присутствует.

EDIT2: Исключение фактически обрабатывается пользовательским классом для сохранения трассировки стека, после регистрации он не перебрасывается. Остается вопрос, могу ли я в этом случае высмеивать и бросать исключение.

Ответы [ 4 ]

1 голос
/ 25 октября 2011

Не смейтесь над методом GetQueryable (), но класс, который отвечает за получение запроса.

Полагаю, у вас есть такой код в GetQueryable ()

private IQueryable<T> GetQueryable<T>()
{
     return repository.query...
}

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

Насмешка, что использование MoQ не должно быть сложным - что-то вроде

var mock = new Moq.Mock<IRepository<Blog>>();
mock.Setup(r => r.Query()).Throws(new Exception("I'm really unexpected"));

Я сомневаюсь, приведет ли этот тест к улучшению качества кода или уменьшению количества ошибок. Но приведенный выше способ порадует инструмент покрытия;)

1 голос
/ 25 октября 2011

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

[TestMethod]
[ExpectedException(typeof(Exception),
"A exception has been throws.")]
public List<Blog> SelectActiveBlogs()
{
    List<Blog> returnCode = null;

    try
    {
        returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return returnCode;
}

Другое дело, если вы реализуете его таким образом, вам не нужен блок try catch.Если вы перехватываете исключение и только перебрасываете его (без какой-либо другой обработки исключений), это не имеет смысла.

Надеюсь, это поможет, если нет, оставьте комментарий.Хорошего дня!

1 голос
/ 25 октября 2011

Я предполагаю, что вы не проверяете это.

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

В этом конкретном случае вы должны просто удалить try / catch / throw, потому что это все равно бессмысленный код.

0 голосов
/ 25 октября 2011

Если вы хотите войти в exception, вы можете смоделировать вызов GetQueryable<Blog>() и вернуть NULL, что должно привести к выбрасыванию кода exception. Или вы можете просто сгенерировать исключение при имитации этого вызова, в зависимости от того, как вы реализовали макет. Кстати, вы потеряете трассировку стека в этом коде, если вы выполните throw ex.

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