2010-10-18 3 views
2

Если я хочу проверить, что метод генерирует исключение определенного типа, атрибут ExpectedException NUnit не заботится о фактическом типе; если я бросаю родовое исключение перед вызовом метода, тест пройден:NUnit's TestCustomException не заботится о типе исключения

[Test, ExpectedException(typeof(TestCustomException))] 
    public void FirstOnEmptyEnumerable() 
    { 
     throw new Exception(); // with this, the test should fail, but it doesn't 
     this.emptyEnumerable.First(new TestCustomException()); 
    } 

Если я хочу, чтобы проверить, что тест бросает точный тип исключения, я должен сделать что-то руководство, как это:

[Test] 
    public void FirstOnEmptyEnumerable() 
    { 
     try 
     { 
      throw new Exception(); // now the test fails correctly. 
      this.emptyEnumerable.First(new TestCustomException()); 
     } 
     catch (TestCustomException) 
     { 
      return; 
     } 

     Assert.Fail("Exception not thrown."); 
    } 

Я что-то пропустил?

ответ

4

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

[Test] 
public void FirstOnEmptyEnumerable() 
{ 
    Assert.Throws<TestCustomException>(() => this.emptyEnumerable.First(new TestCustomException())); 
} 

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

+0

+1 Более приятное решение :) –

+0

Это хорошая идея, и я думаю, что это подойдет большинству случаев, но я стараюсь избегать исключения в утверждениях в качестве теста. Мне нравится различие между двумя (исключение и результат), и, кроме того, я чувствую, что это осложняет мои тесты (два типа тестов) – Neowizard

+0

Я думаю, что это вопрос предпочтений. Я предпочитаю этот подход. Спасибо, Джексон Папа! – stiank81

0

Я всегда проверить на строковое представление исключения т.д .:

[Test, ExpectedException("Your.Namespace.TestCustomException")] 
public void FirstOnEmptyEnumerable() 
{ 
    throw new Exception(); // with this, the test should fail, but it doesn't 
    this.emptyEnumerable.First(new TestCustomException()); 
} 

который, кажется, работает хорошо для меня.

+1

В общем, не рекомендуется использовать строки, как это , Если вы измените имя своего исключения, тест будет недействительным. К счастью, в этом случае тест начнет терпеть неудачу, поэтому, вероятно, вы увидите это и обновите ExceptedException в тесте. Тем не менее, это боль, чтобы пройти через это. Преимущество, использующее строку, заключается в том, что вам не нужно ссылаться на сборку, содержащую определение исключения. – stiank81

+0

Спасибо за информацию. Если путь строк не рекомендуется, а метод 'typeof()' не работает для OP, каким образом вы рекомендуете? –

+0

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

0

Если вы хотите использовать подпись ExpectedException (строка), лучшая практика будет использовать TYPEOF (Exception) .Name и TypeOf (Exception) .Namespace

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