Форум программистов, компьютерный форум, киберфорум
and_y87
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Yii2 создание UInit теста

Запись от and_y87 размещена 24.05.2022 в 19:55
Обновил(-а) and_y87 24.05.2022 в 19:58

Примере на `Basic` версии

1. Создание class'a для unit теста
В папке с тестами создаём class:
  • `tests/unit/UserTest.php`
шаблон
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
namespace tests;
 
/**
 * Class UserTest
 *
 * Запуск теста:
 *  php /vendors/codeception/base/codecept run unit UserTest
 */
class UserTest extends \Codeception\Test\Unit
{
    /** @var \tests\UnitTester $tester */
    protected $tester;
 
    /** @var UserService $component */
    protected $component;
 
    /**
     *  опционально можно добавить зависимость от другой ф@return void
     */
    protected function _before()
    {
        // место для вставки кода Фикстур
    }
 
 
    /**
     * Метод который нужно вызвать для теста должен содержать суффикс `Test`
     *
     * @throws \Exception
     */
    public function someNameTest()
    {
        // место для вызова тестируемого компонента
    }
}


описываем метод `_before` в котором подгружаем фикстуры и назначаем компонент для тестирования
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    /**
     * @return void
     * @throws InvalidConfigException
     */
    protected function _before()
    {
        $this->tester->haveFixtures([
            'user' => UserFixture::class,
        ]);
        
        $this->component = \Yii::createObject([
            'class' => UserService::class,
            'other' => 'pframs'
        ]);
    }
Описываем метод который будет вызван для тестирования:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * Метод который нужно вызвать для теста должен содержать суффикс `Test`
 *
 * @throws \Exception
 */
public function userTest()
{
        $userList = [];
 
        // Поиск пользователя по статусу (через компонент)
        $userList[($status_id = User::STATUS_DELETED)] = $this->userService->findByStatus( $status_id );
        
        // Проверка наличия пользователя из фикстуры
        $this->assertTrue( count($userList[$status_id]), "Не найден удалённый пользователь status_id = $status_id");
 
        // Поиск пользователя по роли (через компонент)
        $userList[($role_id = User::ROLE_ADMIN)] = $this->userService->findByStatus( $role_id );
        
        // Проверка отсутствия пользователя с ролью `admin`
        $this->assertFalse( empty($userList[$role_id]), "Найден пользователь с ролью role_id = $role_id");
 
        // Создание пользователя (через компонент)
        $this->userService->add(['User' => $this->userData ]);
 
        // Получение пользователя (через компонент)
        $admin = $this->userService->getByID(self::USER_ADMIN_ID);
 
        // Проверка, что пользователь создан 
        $this->assertTrue( $admin, 'На удалось найти пользователя Администратора с id = ' . self::USER_ADMIN_ID);
 
        // Проверка корректности данных созданного пользователя
        $this->assertEquals( $admin->getAttributes(), $this->userData, 'Добавление пользователя произошло с ошибкой' );
}
`$this->assert` целый набор на все случаи жизни.

полная версия класса
  • `tests/unit/UserTest.php`
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * Class UserTest
 *
 * Запуск теста:
 *  php /vendors/codeception/base/codecept run unit UserTest
 */
class UserTest extends \Codeception\Test\Unit
{
    const USER_ADMIN_ID = 1;
 
    /** @var \tests\UnitTester $tester */
    protected $tester;
 
    /** @var UserService $userService */
    protected $userService;
 
    protected $userData = [
        'id' => self::USER_ADMIN_ID,
        'name' => 'Admin',
        'email' => 'admin@site.test'
        //... все другие `required` поля
    ];
 
    /**
     * @return void
     * @throws InvalidConfigException
     */
    protected function _before()
    {
        $this->tester->haveFixtures([
            'user' => UserFixture::class,
        ]);
 
        $this->userService = \Yii::createObject([
            'class' => UserService::class,
            'other' => 'pframs'
        ]);
    }
 
    /**
     * Метод который нужно вызвать для теста должен содержать суффикс `Test`
     *
     * @throws \Exception
     */
    public function userTest()
    {
        $userList = [];
 
        // Поиск пользователя по статусу (через компонент)
        $userList[($status_id = User::STATUS_DELETED)] = $this->userService->findByStatus( $status_id );
 
        // Проверка наличия пользователя из фикстуры
        $this->assertTrue( count($userList[$status_id]]), "Не найден удалённый пользователь status_id = $status_id");
 
        // Поиск пользователя по роли (через компонент)
        $userList[($role_id = User::ROLE_ADMIN)] = $this->userService->findByStatus( $role_id );
 
        // Проверка отсутствия пользователя с ролью `admin`
        $this->assertFalse( empty($userList[$role_id]), "Найден пользователь с ролью role_id = $role_id");
 
        // Создание пользователя (через компонент)
        $this->userService->add(['User' => $this->userData ]);
 
        // Получение пользователя (через компонент)
        $admin = $this->userService->getByID(self::USER_ADMIN_ID);
 
        // Проверка, что пользователь создан
        $this->assertTrue( $admin, 'На удалось найти пользователя Администратора с id = ' . self::USER_ADMIN_ID);
 
        // Проверка корректности данных созданного пользователя
        $this->assertEquals( $admin->getAttributes(), $this->userData, 'Добавление пользователя произошло с ошибкой' );
    }
}



2. создание фикстур для теста
в директории `tests` создаём новую с именем `fixtures` (если её нет)
в ней ещё одну директорию (по названию класса с теста для которого делаются фикстуры ) `UserTest`
в последней директории создаётся class
  • `tests/fixtures/UserTest/UserFixture.php`
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
namespase tests/fixtures/UserTest;
 
class UserFixture extends ActiveFixture
{
    /** @var string класс для которого будем добавлять данные */
    public $modelClass = User::class;
 
    /** 
    * ОПЦИОНАЛЬНО: путь по которому будут браться данные для Фикстур
    * @var string  
    */
    public $dataFile = '@tests/fixtures/UserFixture/data/user.php';
 
    /**
     *  ОПЦИОНАЛЬНО: зависимость от другой Фикстуры
     * @var array
     */
    public $depends = [
        RoleFixture::class,
    ];
}
По умолчанию данные будут искаться в файле:
  • `tests/fixtures/UserFixture/data/user.php`
Поэтому создаём его по вышеуказанному пути с контентом:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
return [
  0 => [
        'name' => 'testuser1',
        'email' => 'testuser1@site.test'
        //... все другие `required` поля
  ],
  1 => [
        'name' => 'testuser1',
        'email' => 'testuser1@site.test'
        //... все другие `required` поля
  ],
]
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru