Ошибка MSTest ExpectedException - PullRequest
       14

Ошибка MSTest ExpectedException

13 голосов
/ 03 ноября 2011

Я обычно использую Nunit, но в моем текущем проекте я использую MSTest.Теперь у меня есть тест, который ожидает исключения, но продолжает терпеть неудачу, и я не имею ни малейшего представления о том, почему.

Вот простой пример, который я использовал для воспроизведения проблемы:

[TestMethod, ExpectedException(typeof(ErrorResponseException))]
        public void should_throw_exception()
        {
            throw new ErrorResponseException();
        }

ErrorResponseException - это класс, который просто наследует от Exception, то есть все, кто знает, почему это не удается, я ожидаю, что оно пройдет.

Ответы [ 6 ]

14 голосов
/ 03 ноября 2011

В NUnit я бы избегал ExpectedException и использовал бы вместо него Assert.Throws (Exception Asserts). Это дает вам более тонкий контроль. В противном случае тест будет пройден, если какая-либо часть метода теста сгенерирует это исключение.

В MSTest вы можете получить тот же уровень контроля с конструкцией старой школы:

try
{
    // code that you expect to throw goes here
    Assert.Fail("Expected MyException");
}
catch (MyException ex)
{
    // optionally assert on the message - this can make tests fragile though
}

При этом нет необходимости в атрибуте ExpectedException.

(Концепция взята из книги Дэвида Астелса «Разработка через тестирование: практическое руководство».)

4 голосов
/ 11 февраля 2012

Бесстыдный плагин, но я написал простую сборку, которая делает утверждение для исключений и сообщений об исключениях немного проще и более читабельным в MSTest с использованием синтаксиса Assert.Throws () .Я написал сообщение в блоге с полной информацией.

3 голосов
/ 09 мая 2017

У меня была такая же проблема, и я нашел другое решение. Мой метод тестирования был async, но я забыл ключевое слово await перед вызовом в моем методе тестирования.

Тест:

    [TestMethod]
    [ExpectedException(typeof(InvalidOperationException))]
    public async Task ShouldDoSomething(){
         // notice the missing await in the next line
         this.testObject.DoSomethingAsync();
    }

Метод проверки:

        public async Task<bool> DoSomethingAsync(){
            if(something)
            {
                throw new InvalidOperationException("Error while doing something");
            }
            return false;
        }

Когда я запустил свой тест, он провалился. Но как только я изменю тест на следующий:

[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public async Task ShouldDoSomething(){
     await this.testObject.DoSomethingAsync();
}

у меня это сработало.

3 голосов
/ 14 мая 2014

Если вы используете MSTest 10.0.1.0.0, ExpectedException не работает должным образом, вместо этого используйте 10.0.0.0.0.

1 голос
/ 05 октября 2017

В Visual Studio 15 с зависимостями от MSTest.TestAdapter v1.1.18 и MSTest.TestFramework v1.1.18 вы также можете использовать

Assert.ThrowsException<ArgumentNullException>(() => MethodThatThrowsArgumentNullException());

1 голос
/ 15 сентября 2017

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

В качестве примера я создал проект модульного теста в VS2017, и он получает ExpectedException от Microsoft.VisualStudio.TestPlatform.TestFramework V14.0.0.0 - тест проходит в среде IDE, но завершается сбоем в TeamCity, даже если используется бегун VSTest по версии 2017.

В конечном итоге я получил его для передачи в TeamCity, удалив все ссылки на эту DLL в моих тестовых проектах и ​​заменив их версией Mirosoft.VisualStudio.QualityTools.UnitTestFramework на версию 10.0.0.0 *.

...