Могу ли я повторить модульный тест несколько раз над коллекцией в Visual Studio 2008? - PullRequest
0 голосов
/ 27 августа 2009

У меня есть модульный тест, в котором я запускаю метод для каждого элемента в коллекции (используя foreach). В настоящее время у меня есть утверждение в конце foreach, чтобы проверить, вернул ли метод правильное значение. Это работает, но в результате происходит сбой теста при первом сбое метода. Никакие последующие предметы в коллекции не проверены.

Я бы хотел провести полноценный тест для каждого элемента в коллекции. Тест запускается для каждого элемента, даже если один не пройден. И окно результатов теста показывает данные результатов для каждого прохода.

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

Мой текущий тест выглядит так:

public void TestXHTMLBlock()
        {
            foreach (XmlNode current in Test_Cases.SelectNodes("Test_Cases/Test_Case"))
            {
                XHTMLBlock x = new XHTMLBlock(current.SelectSingleNode("Input").CreateNavigator(), "");
                XmlDocument temp = new XmlDocument();
                temp.LoadXml("<Output>" + x.sWordML(false) + "</Output>");


                XmlDiff diff = new XmlDiff(XmlDiffOptions.IgnoreComments |
                                     XmlDiffOptions.IgnoreDtd |
                                     XmlDiffOptions.IgnoreNamespaces |
                                     XmlDiffOptions.IgnorePI |
                                     XmlDiffOptions.IgnorePrefixes |
                                     XmlDiffOptions.IgnoreWhitespace |
                                     XmlDiffOptions.IgnoreXmlDecl);

                StringBuilder str = new StringBuilder();
                XmlWriter xwrite = XmlWriter.Create(str);

                bool ret = diff.Compare(current.SelectSingleNode("Output"), temp.SelectSingleNode("Output"), xwrite);
                xwrite.Close();

                Assert.IsTrue(ret, current.SelectSingleNode("Description").InnerText);
            }
        }

Я знаю, что это выглядит как главный кандидат на источник данных XML, но я не могу заставить это работать. Тег Input содержит XML, который источник данных пытается проанализировать. Это означает, что я не могу правильно получить к нему доступ в своем тесте, и анализатор источника данных захлебывается некоторыми из моего входного XML. Если бы я мог сказать анализатору источника данных XML обрабатывать внутренний XML как текст, это также сработало бы ...

Ответы [ 3 ]

1 голос
/ 27 августа 2009

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

List<Item> errors = new List<Item>();
foreach(Item item in items)
{
   if( string.IsNullOrEmpty(item.Name))
   {
     errors.Add(item);
   }
} 
Assert.IsTrue(errors.Count == 0,"There are items with no name"); 

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

0 голосов
/ 27 августа 2009

Я хотел бы рассмотреть возможность использования StringBuilder и добавления строки к каждой ошибке.

В конце вы можете проверить, является ли StringBuilder пустым, а затем записать его в console / debug / trace, независимо от того, что автоматически собирает ваша инфраструктура модульного тестирования, и позволить тесту завершиться неудачей с помощью Assert.Fail () или аналогичного

0 голосов
/ 27 августа 2009

Если вы используете nUnit 2.5.x, ValueSourceAttribute может быть тем, что вы ищете. Это будет повторять весь тест один раз для каждого члена указанного IEnumerable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...