Как выполнить интеграционное тестирование с помощью dataProvider не создавая кучу экземпляров модели?

Всё про тестирование в Yii 2.0
Ответить
sergey-o90
Сообщения: 2
Зарегистрирован: 2021.05.28, 21:06

Как выполнить интеграционное тестирование с помощью dataProvider не создавая кучу экземпляров модели?

Сообщение sergey-o90 »

Хочу протестировать методы приложения. При этом это инеграционное тестирование, то есть прямая связь с БД. Например пользователей нужно проверить на "активность", на "роль/права", на "состоит ли в друзьях" и другие всякие методы. Для этого будет много разных методов тестирования. Но для каждого из них нужно много входных данных, провайдеры даннных. Сейчас я пишу что-то типа такого:

Код: Выделить всё

  <?php
    
    namespace tests\unit\services\user;
    
    use app\models\User;
    use app\services\User as UserService;
    
    use Codeception\Test\Unit;
    
    class UserTest extends Unit {
    	
    	/**
    	 * @var \UnitTester
    	 */
    	protected $tester;	
    	protected function _before() { }	
    	protected function _after() { }
    	
    	/**
    	* @dataProvider getUsersForActivity
    	*/
    	public function testUserIsActive($user, $result) {	
    		$userService = new UserService($user);
    		self::assertEquals($userService->isActive(), true);
    	}
    	
    	public function getUsersForActivity() {
    		return [
    			[User::findOne(['id' => 1]) => true],
    			[User::findOne(['id' => 2]) => false],
    			[User::findOne(['id' => 456]) => false],
    			[User::findOne(['id' => 87]) => true],
                // куча других пользователей
    		];
    	}
    }

И вот таких провайдеров может быть десяток. В каждом из них модель обращается к БД, тянет данные и тестируется. Это слишком трудозатрадно для БД, учитывая, что это только пользователи, а могут быть ещё другие сотни тестов, которые ещё больше трудоёмкие.

Вопрос: как правильно делать интеграционное тестирование? Как правильно загрузить данные для прогона теста, чтобы это не загружать так БД? Например как-то создать кэшированный запрос и подставлять туда id из массива?

Ответить