Покрытие кода с помощью phpunit; не может добраться до одного места - PullRequest
0 голосов
/ 16 марта 2010

В покрытии кода xdebug отображается строка «return false;» (ниже "! $ r"), что не охвачено моими тестами. Но $ sql в основном жестко запрограммирован. Как мне получить покрытие на это? Я перезаписываю "$ table" как-нибудь? Или убить сервер базы данных для этой части теста?

Наверное, это говорит мне о том, что я не очень хорошо пишу свою модель, верно? Потому что я не могу это хорошо проверить. Как я могу написать это лучше?

Поскольку эта одна строка не покрыта, весь метод не охватывается, а отчеты отключены.

Я довольно новичок в phpunit. Спасибо.


public function retrieve_all()
{
    $table = $this->tablename();
    $sql     = "SELECT t.* FROM `{$table}` as t";
    $r         = dbq ( $sql, 'read' );

    if(!$r)
    {
        return false;
    }

    $ret = array ();

    while ( $rs    = mysql_fetch_array ( $r, MYSQL_ASSOC ) )
    {
        $ret[] = $rs;
    }


    return $ret;
}

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Теоретически лучше разделить модель и весь код, связанный с базой данных.

Например, в Zend Framework руководство по быстрому запуску советует иметь:

  • ваша модель классов
  • ваши картографы данных, чья роль состоит в том, чтобы "преобразовать" модель в модель базы данных.
  • ваши DAO (или шлюз данных таблиц), которые осуществляют прямой доступ к таблицам

Это действительно интересная модель, вам стоит взглянуть на нее, она позволяет вам реально отделить модель от данных и, таким образом, выполнять тесты только для части модели (и не заботиться о проблемах с базой данных). / вопрос)

Но в вашем коде я предлагаю вам выполнить тест, в котором у вас есть функция dbq (), которая возвращает false (возможно, наличие связи db невозможно «нарочно»), чтобы иметь полный код покрытие.

У меня часто бывают такие ситуации, когда тестирование всех "случаев ошибок" отнимает у вас слишком много времени, поэтому я отказываюсь от 100% покрытия кода.

0 голосов
/ 16 марта 2010

Полагаю, функция dbq() выполняет запрос к базе данных. Просто отключите соединение с базой данных и повторите тест.

Причина, по которой у вас возникают проблемы с тестированием, заключается в том, что вы используете глобальный ресурс: соединение с базой данных. Обычно вы избегаете этой проблемы, предоставляя свой объект подключения методу (или классу) теста.

...