Деякі люди стверджують, що тести на інтеграцію - це всілякі погані та неправильні дії - все повинно бути перевіреним одиницею, а це означає, що ви повинні знущатися над залежностями; варіант, який з різних причин я не завжди люблю.
Я вважаю, що в деяких випадках одиничне тестування просто нічого не доводить.
Візьмемо для прикладу наступну (тривіальну, наївну) реалізацію сховищ (у PHP):
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
Скажімо, я хочу довести в тесті, що в цьому сховищі можна знайти продукти, що відповідають різним ключовим словам.
Окрім тестування інтеграції з реальним об'єктом з'єднання, як я можу знати, що це насправді генерує реальні запити - і що ці запити насправді роблять те, що я думаю, що вони роблять?
Якщо мені доведеться знущатися над об’єктом підключення в блок-тесті, я можу лише довести такі речі, як "він генерує очікуваний запит" - але це не означає, що він насправді буде працювати ... тобто, можливо, це генерує запит Я очікував, але, можливо, цей запит не відповідає тому, що я думаю, що це робить.
Іншими словами, я відчуваю себе тестом, який робить твердження про згенерований запит, по суті, не має значення, оскільки це тестування того, як findByKeyword()
метод був реалізований , але це не доводить, що він насправді працює .
Ця проблема не обмежується репозиторіями чи інтеграцією баз даних - вона, мабуть, застосовується у багатьох випадках, коли твердження про використання макету (тест-подвійний) лише доводить, як реалізуються речі, а не чи збираються вони насправді працюють.
Як ви вирішуєте подібні ситуації?
Чи справді інтеграційні тести "погані" у такому випадку?
Я розумію, що краще перевірити одне, і я також розумію, чому тестування інтеграції призводить до безлічі кодових шляхів, які всі не піддаються тестуванню - але у випадку служби (наприклад, сховища), єдиною метою якої є щоб взаємодіяти з іншим компонентом, як ви можете реально протестувати що-небудь без тестування інтеграції?