2016-04-20 3 views
2

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

Мой вопрос касается функций, которые делают что-то вроде файлов. Они ничего не возвращают, но они делают что-то для скрипта в целом.

Скажем, у меня есть класс, который включает в себя файл:

<?php 

class Includer { 
    public function __construct() { 
     $this->include_file("/var/www/index.html"); 
    } 

    public function check_file_validity($file = "") { 
     // Check to see if the file exists 
     return true; // if exists 
    } 

    public function include_file($file = "") { 
     if ($this->check_file_validity($file)) { 
      include $file; 
     }   
    } 
} 

я могу написать тест, чтобы утверждать, что файл существует (check_file_validity), и это было бы прямо вперед.

Однако было бы приемлемым возвращать логическое значение в функции include_file на основе того, был ли включен файл? Разве это не было бы лишним тестом, поскольку в основном то же самое происходит при запуске функции check_file_validity?

Следует отметить, что информация, содержащаяся в файле, поступает с URL-адреса, поэтому никакие файлы здесь не будут жестко закодированы вне тестов (если только я не издечу параметры $_GET).

ответ

1

Как правило, я считаю безопасным предположить, что функции PHP работают, и нет необходимости их повторять. Вместо этого, если вы хотите протестировать код, который использует такую ​​функцию, как include, может быть неплохо обернуть его. Таким образом, код может выглядеть следующим образом:

<?php 

class Includer { 
    public function __construct() { 
     $this->include_file("/var/www/index.html"); 
    } 

    public function check_file_validity($file = "") { 
     // Check to see if the file exists 
     return true; // if exists 
    } 

    public function include_file_if_exists($file = "") { 
     if ($this->check_file_validity($file)) { 
      $this->include_file($file); 
     }   
    } 

    public function include_file($file = "") { 
     include $file; 
    } 
} 

include_file_if_exists() Чтобы проверить, вы просто издеваетесь своим классом, так что вы можете проверить, был ли include_file() называется или нет, а если есть правильный аргумент.

Что касается include_file() сам по себе, его больше не нужно тестировать, поскольку оно только обертывает include.

+0

Не могли бы вы сказать, что это надуло бы код, что затрудняет отслеживание проблем в конечном итоге из-за добавленных функций? Ваш ответ помогает мне понять, что делать, поэтому спасибо за это. – helllomatt

+0

Всё зависит от меня. Обычно вы хотите группировать эти функции, поэтому вместо добавления метода 'include' вам может потребоваться рассмотреть объект многократного использования. Или, если вы хотите разобрать текстовые файлы, вы должны создать класс 'Reader' и использовать это вместо необработанных функций PHP. Но вам не нужно все проверять. И в вашем случае было бы прекрасно проверить «check_file_validity». Но я хотел показать вам, как еще можно тестировать методы, используя такие функции, если логика усложняется. –

Смежные вопросы