C # Как фильтровать не утверждать исключения в модульном тестировании - PullRequest
2 голосов
/ 06 сентября 2011

У меня есть метод test, у которого нет четкого выражения assert.Возвращаемое проверенное значение представляет собой очень длинную строку, которая должна быть проверена программистом, чтобы проверить, правильно это или нет.По этой причине, если код выполняется без исключений, я вызываю «Assert.Inconclusive».

Однако, если выдается какое-то исключение, я хочу вызвать «Assert.Fail» с сообщением об исключении,Примерно так:

      [TestMethod()]
      public void Test()
      {
        try {
            string toBeChecked = MethodToBeTested();
            //the string is so particular that no clear
            //assertion can be made about it.

            Console.WriteLine(toBeChecked);             
            Assert.Inconclusive("Check the console output.");            
        } catch(Exception e) {
            Assert.Fail(e.Message);
        }
      }

Проблема с этим кодом состоит в том, что если не генерируется регулярное исключение, метод Assert.Inconclusive также генерирует исключение, которое перехватывается, поэтому вызывается Assert.Fail и изВ панели результатов теста IDE кажется, что тест не пройден.Это не то, что я хочу.

Есть ли способ отфильтровать исключения, например перехватывать все исключения, кроме Assert-подобных?

(я использую .NET Framework 3.5SP1)

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

Метод Assert.Inconclusive должен выдавать исключение AssertInconclusiveException, чтобы вы могли пометить тест как ExcpectedException(typeof(AssertInconclusiveExcpetion)) или использовать что-то вроде этого:

  [TestMethod()]
  public void Test()
  {
    try {
        string toBeChecked = MethodToBeTested();
        //the string is so particular that no clear
        //assertion can be made about it.

        Console.WriteLine(toBeChecked);             
        Assert.Inconclusive("Check the console output.");            
    } catch(AsssertInconclusiveException) {
       /* Do nothing */
    }
    } catch(Exception e) {
        Assert.Fail(e.Message);
    }
  }
2 голосов
/ 06 сентября 2011

Почему бы просто не пропустить Assert.Inconclusive ()? На самом деле, зачем вообще перехватывать какие-либо исключения - если код выдает исключение, среда модульного тестирования помечает его как сбойный. Меньше значит больше:

  [TestMethod()]
  public void Test()
  {
     string toBeChecked = MethodToBeTested();
     Console.WriteLine(toBeChecked);             
  }

Но это плохой юнит-тест, если мы не можем автоматически проверить результат. Все, что мы проверяем, это то, что исключение не выдается. Нет ли утверждений, которые можно сделать с полученной строкой?

Например, это не ноль или пусто? Мы ожидаем, что он будет содержать определенную подстроку, которую мы можем проверить?

По крайней мере, дайте тесту полезное имя, которое включает в себя что-то вроде: ManualAssertRequired

1 голос
/ 06 сентября 2011

Попробуйте перехватить определенный тип исключения вместо Exception или добавить еще один улов для исключительной ситуации, вызванной Assert.Inconclusive методом, AssertInconclusiveException ...

Например, измените его следующим образом:

  [TestMethod()]
  public void Test()
  {
    try {
        string toBeChecked = MethodToBeTested();
        //the string is so particular that no clear
        //assertion can be made about it.

        Console.WriteLine(toBeChecked);             
        Assert.Inconclusive("Check the console output.");    
    } catch(AssertInconclusiveException e) {
        // do nothing...
    } catch(Exception e) {
        Assert.Fail(e.Message);
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...