Я написал веб-приложение с использованием PHP и JS, которое сейчас работает, и решил, что мне следует узнать о модульном тестировании и внедрить его сейчас, очищая свой код.
Я смущен тем, что должно быть модульно протестировано. Каждый учебник PHPUnit, который я видел, тестирует геттеры, сеттеры, подсчитывает элементы в массивах. На сайте, над которым я работаю, есть страница, на которой отображаются фотографии. Пользователь может лайкнуть фотографию или добавить ее в избранное. PHP в основном используется на сайте в качестве уровня API для клиентской части, на которой работает backbone.js.
Как мне написать модульные тесты для этих функций? Функция (, показанная ниже ), получает $_GET-данные, отправленные ей через AJAX, и вставляет несколько строк в базу данных. Он не содержит сеттеров, геттеров, ничего не считает и не является классом. Должен ли он вообще иметь модульный тест?
Пример модульного теста, который я могу написать для этих функций, будет действительно потрясающим!:)
/**
* Create new Set and add item to it
* @return void
*/
public function action_create_set() {
// Get data from user
$user_id = Input::get('user_id');
$post_id = Input::get('post_id');
$set_name = Input::get('set_name');
// Create new set
$data = array(
'user_id' => $user_id,
'name' => $set_name
);
$set_id = DB::table('sets')->insert_get_id($data);
// Add item to newly created set
DB::query("INSERT IGNORE INTO posts_sets (post_id, set_id, user_id)
VALUES ($post_id, $set_id, $user_id)");
// Change `created_at` & `updated_at` col of 'sets'
$data = array(
'created_at' => DB::raw('NOW()'),
'updated_at' => DB::raw('NOW()')
);
DB::table('sets')
->where('id', '=', $set_id)
->update($data);
}
Для этой первой функции у меня сложилось впечатление, что можно написать тест, чтобы проверить, что эти 3 переменные $user_id, $post_id, $set_name
должны содержать данные. Я чувствую, что должен быть тест, чтобы проверить, работают ли 2 insert
запросов,но я также думаю, что функции, которые вставляют строки, предоставляются фреймворком PHP и уже были тщательно протестированы, поэтому дальнейшее модульное тестирование не требуется.
Другое предположение заключается в том, что тест должен предоставить функции 3 переменные, а затем проверить, были ли вставлены новые строки в 2 таблицы, но не будет ли это считаться интеграционным тестом?
Вот функция, которая принимает данные от пользователя через AJAX, а затем возвращает результат в формате JSON. Должен ли PHPUnit обрабатывать такие функции API? Или модульное тестирование должно выполняться на стороне клиента?
/**
* Get items Liked by user
* @return array
*/
public function action_likes() {
$user_id = Input::get('user_id');
$likes = DB::table('likes')
->join('posts', 'posts.id', '=', 'likes.post_id')
->where('likes.user_id', '=', $user_id)
->get();
return json_encode($likes);
}