ExpectedException не перехватывает исключение, но я могу поймать его с помощью try catch - PullRequest
2 голосов
/ 12 марта 2009

Есть идеи на этот счет? Я пытаюсь написать модульный тест, который удалит элемент и подтвердит, что элемент больше не находится в хранилище, пытаясь извлечь элемент по его идентификатору, который должен вызвать исключение DataAccessException. Тем не менее, тест продолжает проваливаться. Я добавил блок try catch и, конечно же, перехватил ожидаемое исключение. Я использую VS Test Tools для модульного тестирования.

    [ExpectedException(typeof(DataAccessException))]
    private static void NHibernateRepositoryBaseDeleteHelper<T, TKey>(T myItem, TKey myItemId)
    {
        MyTestRepository<T, TKey> myRepository = new MyTestRepository<T, TKey>();
        myRepository.Delete(myItem);
        myRepository.CommitChanges();
        try
        {
            myRepository.GetById(myItemId, false);
        }
        catch (DataAccessException dae)
        {
            Assert.IsTrue(true);
        }
    }

Ответы [ 3 ]

5 голосов
/ 12 марта 2009

Я добавлю к тому, что сказал Джаред, указав, что атрибут ExpectedException - отстой. Невозможно утверждать, что сообщение об исключении является правильным (параметр «message» не выполняет то, о чем вы думаете), и вы не можете проверить несколько исключений в одном тесте.

Лучшее решение - сделать что-то вроде этого: http://geekswithblogs.net/sdorman/archive/2009/01/17/unit-testing-and-expected-exceptions.aspx

Этот класс позволяет вам делать такие аккуратные вещи, как это:

[TestMethod]
public void TestAFewObviousExceptions()
{
// some setup here
   ExceptionAssert.Throws("Category 47 does not exist", () => 
                wallet.Categories.GetChildCategoryIds(47));
   ExceptionAssert.Throws("Id Flim is not valid", () => 
                wallet.Categories.IdFromName("Flim"));
}
4 голосов
/ 12 марта 2009

Необходимо добавить атрибут ExpectedException для того же метода, который имеет атрибут TestMethod Платформа VS Unit Test Framework будет искать атрибут ExpectedException только в точке входа конкретного теста.

[TestMethod]
[ExpectedException(typeof(DataAccessException))]
public void ATestMethod() {
  ...
  NHibernateRepositoryBaseDeleteHelper(itemValue, keyValue);
}
0 голосов
/ 12 марта 2009

В первую очередь вы используете ваш метод удаления. У меня был бы отдельный метод удаления и метод испытания. Да, вы тестируете удаление, но на самом деле вы тестируете поведение, связанное с удалением. Здесь, вероятно, есть дополнительные тесты.

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

Надеюсь, это поможет.

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