2010-07-02 2 views
1

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

Я был под впечатлением, что я мог бы сделать что-то вроде следующего:

ICommand command = CreateCommandObj(); 
Assert.That(() => command.DoWork(), Throws.TypeOf<ArgumentException>(),       
        Has.Property("ParamName").EqualTo("myParam") & 
Has.Property("Message").EqualTo("myMessage")); 

Однако это даже не компилировать и смотрит на ожидаемых параметров Assert.That я не могу видеть, как я бы быть в состоянии сделать это? Я уверен, что я использовал это раньше, хотя ...

Примечания выше надуманный пример, чтобы проиллюстрировать этот момент, игнорировать тот факт, я ищу для ArgumentException по методе, который не делает, за исключением каких-либо параметров :)

Любая помощь приветствуется.

1) Невозможно преобразовать выражение лямбда, чтобы набрать «объект», потому что это не тип делегата.

ответ

7

Хорошо, отсортировано.

мне нужно использовать следующий синтаксис:

ICommand command = CreateCommandObj(); 
Assert.That(() => command.DoWork(), 
        Throws.TypeOf<ArgumentException>() 
        .And.Message.Equals("MyMessage")); 

Такой подход позволяет мне проверить свойства на брошенном исключении. Я могу добавить любое количество И или Или в Assert.

Спасибо всем за предложения.

+1

Это почти сработало для меня, однако мне пришлось изменить ограничение на 'Throws.TypeOf (). And.Message.StringMatching (" MyMessage "));'. Я предполагаю, что это связано с изменениями, внесенными в структуру NUnit, поскольку это сообщение было сделано. – robyaw

0

Попробуйте & & - логическое и против побитового и

Редактировать:

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

try 
    { 
    command.DoWork(); 
    Assert.Fail("ArgumentException Expected"); 
    } 
    catch (ArgumentException e) 
    { 
    Assert.AreEqual("Expected Message", e.Message); 
    } 
+0

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

1

Вы проверяете исключения с атрибутом [ExpectedException] на свой метод. например

[Test] 
[ExpectedException(typeof(InvalidOperationException))] 
public void Test_SomeMethod() 
{ 
    something.SomeMehthod(); 
} 

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

EDIT Можно также задать тест атрибуты, как следующее:

[Test] 
[ExpectedException(ExpectedException = typeof(InvalidOperationException), ExpectedMessage = "Somethings not right")] 
public void Test_SomeMethond() 
{ 
    something.SomeMehthod(); 
} 
+0

Не ExpectedException устаревший метод утверждения для исключений? Я думал, что это было отменено либо Assert.Throws <>, либо с использованием синтаксиса Constraint? –

+0

Возможно, это так, как я всегда это делал. –

+0

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

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