2013-11-29 5 views
2

При выполнении этого теста:(MSTest) Расширение ExpectedExceptionBaseAttribute скрывает Неудачный тест объяснение

[TestMethod] 
    [ExpectedException(typeof(SpecialException))] 
    public void Test1() 
    { 
     throw new NotImplementedException(); 
    } 

Visual Studio говорит мне, почему он не:.

Метод испытания [...] Test1 бросил исключение System.NotImplementedException, но исключение [...]. Ожидалось специальное исключение. Исключение сообщение: System.NotImplementedException: метод или операция не реализована.

Но когда я пытаюсь расширить ExpectedExceptionBaseAttribute (ожидать для кода ошибки в SpecialException) так:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
class ExpectedSpecialException : ExpectedExceptionBaseAttribute 
{ 
    protected override void Verify(Exception exception) 
    { 
     SpecialException se = exception as SpecialException; 

     if (se == null) 
     { 
      RethrowIfAssertException(exception); 

      throw new Exception("SpecialException was expected but test method threw another one"); 
     } 
    } 
} 

и использовать его так:

[TestMethod] 
    [ExpectedSpecialException] 
    public void Test1() 
    { 
     throw new NotImplementedException(); 
    } 

VS производит не очень информационное сообщение:

Исключение составляет en throw by target of invocation.

Все примеры (1, 2, 3) продлений ExpectedExceptionBaseAttribute я нашел в Интернете, имеют ту же попытку дать более подробную информацию о неисправности в заброшенном исключении, но без результата.

Я что-то не так? Есть ли способ предоставить больше информации о таких неудачных тестах?

+1

Это исключение было вызвано вашим методом Verify, вы должны увидеть InnerException соответствовать Exception вы бросил. Не то, как MSDN говорит вам об этом, вы должны использовать Assert(). –

ответ

3

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

Похоже, что причина, по которой вы не получаете полное сообщение об ошибке из-за nullTestContext.

Вы можете проверить это, посмотрев на реализацию ExpectedExceptionAttribute. Вы можете использовать отражатель, и вы можете видеть, что он внутренне использует TestContext.

Если посмотреть на реализацию ExpectedExceptionBaseAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
Inherited = true)] 
public abstract class ExpectedExceptionBaseAttribute : Attribute 
{ 
    protected internal TestContext TestContext { get; internal set; } 

TestContext устанавливает внутренне во время выполнения и не может быть введен в ExpectedSpecialException атрибута. MSTest's ExpectedExceptionAttribute может получить доступ к TestContext, который был внутренне установлен тестовым бегуном. Важно отметить, что из-за отсутствия расширяемости MSTest мы не можем получить доступ и установить TestContext по своему желанию.

Не уверен, что это поможет, но вы можете настроить свои исключения и pin-point, где исключение выбрасывается с использованием подхода, такого как this. Я думаю, что это лучший подход.

0

Для чего это стоит, я решил это лишь передавая исключения утверждения через к основанию RethrowIfAssertException функции:

protected override void Verify(Exception exception) 
{ 
    if (exception is UnitTestAssertException) 
    { 
     RethrowIfAssertException(exception); 
    } 

    try 
    { 
     Assert.IsInstanceOfType<SpecialException>(exception); 
    } 
    catch (AssertionFailedException ex) 
    { 
     RethrowIfAssertException(ex); 
    } 
} 
Смежные вопросы