2010-06-09 3 views
4

Я довольно новичок в TDD и собираюсь с NUnit и Moq. У меня есть метод, где я ожидаю исключения, поэтому я хотел немного поиграть с функциями фреймворка.NUnit - ExpectedMessage отличается ошибкой

Мой тестовый код выглядит следующим образом:

[Test] 
    [ExpectedException(ExpectedException = typeof(MockException), ExpectedMessage = "Actual differs from expected")] 
    public void Write_MessageLogWithCategoryInfoFail() 
    { 
     string message = "Info Test Message"; 

     Write_MessageLogWithCategory(message, "Info"); 

     _LogTest.Verify(writeMessage => 
      writeMessage.Info("This should fail"), 
      "Actual differs from expected" 
     ); 
    } 

Но я всегда получить ErrorMessage, что сообщение об ошибке, что фактическое сообщение исключение отличается от ожидаемого сообщения. Что я делаю не так?

+1

Какой тест вы используете? – Grzenio

+0

Хоппинг, что я понял вас правильно, я использую NUnit версии 2.5.1 – Mark

+0

, и вы используете свои тесты с помощью nunit-gui.exe? Или вы каким-то образом запускаете их из Visual Studio? – Grzenio

ответ

3

К сожалению, тестовый бегун Resharper имеет ошибку/ограничение - он не обрабатывает атрибуты ExpectedException. У вас есть 2 варианта:

  1. Используйте другой тест бегун (например, NUnit-gui.exe, поставляется с NUnit) - но такой подход делает его боль отлаживать тесты

  2. Поймать и подтвердите исключение вручную, используя следующую схему:

    [Test] общественного недействительными Write_MessageLogWithCategoryInfoFail() { попробовать { строка сообщения = "Test Message Info";

    Write_MessageLogWithCategory(message, "Info"); 
    
        _LogTest.Verify(writeMessage => 
         writeMessage.Info("This should fail"), 
         "Actual differs from expected" 
    ); 
        Assert.Fail("Expected exception"); 
    } 
    catch(MockException e) 
    { 
        Assert.AreEqual("Actual differs from expected", e.Message); 
    } 
    

    }

Его реальный позор, потому что описательный способ сказать, что вы ожидаете, исключение намного лучше!

На стороне записки, я надеюсь, что код выше только для игры с рамками - как правило, вы бы никогда не поймать MockExceptions :)

+1

Спасибо, я проверил ваш код, и я думаю, что теперь знаю, почему он никогда не был равным. Сообщение в исключении больше из-за более подробного сообщения об ошибке: «Фактический отличается от ожидаемого. \ N \ nInvocation не выполнялся в макете: writeMessage => writeMessage.Info (\" This should fail \ ")" Но спасибо за подсказку! И хотя этот тест работает над производственным кодом .. Да, я играю с каркасом ;-) – Mark

+0

У меня такая же ошибка при запуске теста NUnit с TestDrivet.Net: Текст сообщения об исключении был неправильным Ожидаемое: Password_too_short , но was: Password_too_short EDIT: в моем случае сообщение было действительно другим (продолжение после разрыва строки) – GolfWolf

+0

@ w0lf, вы имеете в виду, что в конце сообщения об исключении произошел разрыв строки, но не в том, что вы передали в TestDriven.NET ? –

2

Вы можете использовать дополнительный параметр MatchType = MessageMatch.Regex.

+2

подумайте о предоставлении дополнительного объяснения, почему, по вашему мнению, это решит проблему. Также более подробная информация о том, как применить свое решение, скорее всего, будет фрагментом кода. –

+2

MatchType = MessageMatch.Contains также работает. – Junto

+0

При использовании Resharper это не помогает. –

Смежные вопросы