Я думаю, что Брайан пытался сказать «плохо написанным», что у вас нет разделения между бизнес-логикой и кодом доступа к данным (и механикой соединения с базой данных, пока она здесь).
Правильный подход к написанию функций заключается в том, что функция (или метод) должна делать одну вещь , а не 3 вещи одновременно.
В результате этого большого количества функций, при тестировании , вам необходимо одновременно протестировать ВСЕ ТРИ ТРИ, что сложно (см. Обсуждение использования "test SQLite DB" в этих параграфах) , Или, в качестве альтернативы, сделайте то, чему посвящена глава, и смейтесь над объектом DBI, чтобы проверить бизнес-логику, притворившись, что доступ к данным И настройка БД работали определенным образом.
Но издеваться над объектом со сложным поведением, таким как DBI, очень и очень сложно, чтобы сделать правильно.
Что делать, если база данных недоступна? Что делать, если есть блокировка? Что если в вашем запросе есть синтаксическая ошибка? Что если время соединения с БД истекло при выполнении запроса? Что если ...
Хороший тестовый код проверяет ВСЕ эти ситуации ошибок и многое другое.
Более правильный подход (шаблон) для кода был бы:
my $dbh = set_up_dbh();
my $query = qq[select key, calculate(value) from my_table];
my $data = retrieve_data($dbh, $query);
# Now, we don't need to test setting up database connection AND data retrieval
my $calc_results = calculate_results($data);
Таким образом, чтобы проверить логику в Calculate_results (например, суммируя данные), вам просто нужно смоделировать передаваемые на него данные, что очень просто (во многих случаях вы просто сохраняете несколько наборов тестовых данных в некоторой конфигурации теста). ); в отличие от насмешливого поведения сложного объекта DBI, используемого для извлечения данных.