2016-02-17 5 views
0

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

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

#define BOOST_TEST_MODULE ExportTest 
#include <boost/test/included/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(CsvExport) 
    BOOST_AUTO_TEST_CASE(SimpleTest) { 
     // 
     // ... Code writes Simple.csv to harddisk 
     // 
     // 
     // 
     std::string regExpr= ... // Arbitrary regular expression 
     BOOST_TEST_FILE("Simple.csv", regExpr) 
} 
BOOST_AUTO_TEST_SUITE_END(); 
  1. Есть ли расширение вокруг, которые могут быть использованы, как это? Или мне нужно написать макрос самостоятельно?

  2. Как я могу легко наделить Boost.Test с такой функциональностью, если вокруг нет такого макроса?

Мое окончательное решение:

Наконец, я включил следующую простую функцию в моих тестах.

#include <boost/regex.hpp> 

bool fileContains(const std::string& filename, const std::string& regexp) { 
    std::ifstream file(filename); 
    if (file) { 
     try { 
      std::stringstream buffer; 
      buffer << file.rdbuf(); 
      file.close(); 
      return boost::regex_search(buffer.str(), boost::regex(regexp)); 
     } 
     catch(const std::exception&) { 
      return false; 
     } 
    } else { 
     return false; 
    } 
} 

Использование бы в качестве примера ниже:

BOOST_CHECK(fileContains("Export.csv","-48.434")); 

ответ

1

Это действительно просто мнение, но я думаю, что расширение Boost.Test является ненужным в этом случае. Я бы просто написал функцию match_in_file (fname, regex_as_string), может быть только заголовок, и включить его в любые файлы тестов, которые в этом нуждаются. Тогда вы могли бы написать

BOOST_ASSERT(match_in_file(fname, regexpr)); 

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

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

+0

Большое спасибо за этот подробный ответ. Мне стало ясно, что не будет решения, которое могло бы удовлетворить все требования всех тестов. Кажется, я должен полагаться на запись простой функции, как вы предложили. – Aleph0