2013-11-10 5 views
1

У меня есть оператор, который будет метать, если операнды не подходят. (В частности, он делает десятичное умножение на int-based class, что разрешено, если оно имеет смысл (например, 2 * 0,5), но бросает, если результат не является круглым числом (например, 2 * 0,3))Лучший способ проверить, если * оператор * выбрасывает исключение

кажется, что я не могу использовать Assert.Throws NUnit в <>(), чтобы проверить это, как и все, как я могу думать, чтобы назвать это дает мне ошибку компилятора:

Assert.Throws<InvalidOperationException>(originalValue * badDecimalMultiplier); 
Assert.Throws<InvalidOperationException>(dummy => originalValue * badDecimalMultiplier); 
Assert.Throws<InvalidOperationException>(dummy => dummy = originalValue * badDecimalMultiplier); 
Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier); 
  • Первый пытается передать результат операции как параметр to Throws(), который терпит неудачу, потому что Throws принимает только TestDelegate.
  • Вторая ошибка с «Только назначение, вызов, приращение, декремент и новые выражения объекта могут использоваться как ошибка».
  • Третий не работает с «Делегатом» NUnit.Framework.TestDelegate 'не принимает 1 аргумент ».
  • Четвертый (и все вариации я мог найти) не позволит назначить необъявленной переменной (на самом деле неудивительно)

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

Я ничего не пропустил? Если нет, могу ли я получить подтверждение, так что следующий человек, чтобы попытаться найти это, имеет ответ.

ответ

2

Вы можете объявить переменную за пределами лямбда:

MyClass dummy; 
Assert.Throws<InvalidOperationException>(() => 
     dummy = originalValue * badDecimalMultiplier); 

Вы также можете просто вызвать метод:

Assert.Throws<InvalidOperationException>(() => 
     (originalValue * badDecimalMultiplier).ToString()); 
+0

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

0

Как я написал последнюю строчку, я выясняю решение:

MyIntValuedClass dummy; 
    Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier); 

Now Throws() счастлив, так как у него есть делегат. Делегат счастлив, потому что у него нет аргументов. И операция счастлива, потому что она назначает определенную переменную.

R # жалуется, что манекен никогда не используется, но это неудивительно.

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

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