Skip to content

Commit 71c2b19

Browse files
committed
update step
1 parent b2caec3 commit 71c2b19

File tree

1 file changed

+71
-39
lines changed

1 file changed

+71
-39
lines changed

scripts/steps/step-001.3.md

Lines changed: 71 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
### Формы для сохранения данных
1+
### Сохранение реляционных данных.
2+
3+
#### Формы для сохранения данных
24

35
Вы наверное уже обратили внимание на формы для сохранения:
46

@@ -121,16 +123,16 @@ echo $form->field($model, 'planet')->dropDownList($stars);
121123
Так как формы, для редактирования существующих моделей используются одни и те же, что и для сохранения. То, что-либо новое
122124
создавать не нужно.
123125

124-
#### Сохранение реляционных данных.
126+
#### Проверка работоспособности формы через тест
125127

126-
У нас есть три формы для трёх разных моделей. Представьте себе ситуацию: нужно ввести информацию по новой планете, но звезды
127-
у неё ещё нету. Не совсем удобно переключаться с формы на форму, сохраняя новые данные. Давайте объединим работу с тремя
128-
формами в одной. Для этого нам понадобится новая модель формы, которая будет объединять работу с тремя моделями
129-
относительно модели Планет.
128+
В этом подразделе описывается как написать функциональный тест для формы. Такой тест упростит отладку и разработку формы.
129+
Возможно, вам легче использовать браузер и по сто пятьдесят раз выдумывать и вводить данные, для того, чтобы проверить
130+
сохранение данных через форму, после очередной правки кода. Если это так, то можете пропустить этот подраздел и перейти
131+
дальше. Остальным добро пожаловать.
130132

131-
Давайте начнём с теста. Это упростит отладку и разработку. Будем двигаться небольшими шагами, чтобы было понятнее и легче.
133+
Будем двигаться небольшими шагами, чтобы было понятнее и легче.
132134

133-
Создадим функциональный тест `PlanetFormCept`:
135+
Создадим функциональный тест `PlanetFormCept`, который будет проверять работу формы для сохранения данных по планетам.
134136

135137
```
136138
cd yii2-app-advanced\tests\codeception\backend\
@@ -139,10 +141,10 @@ codecept build
139141

140142
```
141143
codecept generate:cept functional PlanetFormCept
142-
Test was created in PlanetFormCept.php
144+
Test was created in ...
143145
```
144146

145-
Откройте файл теста `PlanetFormCept.php` и измените его содержимое на:
147+
Откройте созданный файл `PlanetFormCept.php` и измените его содержимое на:
146148

147149
```php
148150
<?php use tests\codeception\backend\FunctionalTester;
@@ -160,8 +162,9 @@ codecept run functional functional/PlanetFormCept.php
160162
OK (1 test, 0 assertions)
161163
```
162164

163-
Теперь к тесту добавим команду на открытие страницы с формой. Для этого нужно создать объект этой страницы.
164-
В директории `yii2-app-advanced/tests/codeception/backend/_pages/` создайте `PlanetFormPage.php`:
165+
Как видно запустился 1 тест и выполнилось 0 проверок. Теперь к тесту добавим команду на открытие страницы с формой.
166+
ля этого нужно создать объект этой страницы. В директории `yii2-app-advanced/tests/codeception/backend/_pages/` создайте
167+
`PlanetFormPage.php` с содержимым:
165168

166169
```php
167170
<?php
@@ -209,7 +212,7 @@ $I = new FunctionalTester($scenario);
209212
$I->wantTo('ensure than create form works');
210213
$formPage = \tests\codeception\backend\PlanetFormPage::openBy($I);
211214

212-
$I->fillField('//*[@id="planet-name"]','Земля');
215+
$I->fillField('//*[@id="planet-name"]','Новая Земля');
213216
$I->selectOption('//*[@id="planet-star_id"]', 'Солнце');
214217
$I->click('//*[@id="w0"]/div[3]/button');
215218
$I->dontSeeInTitle('Новая планета');
@@ -251,7 +254,7 @@ modules:
251254
configFile: '../config/backend/functional.php'
252255
```
253256

254-
откройте этот файл и найдите его метод:
257+
Откройте файл помощник `FixtureHelper.php` и найдите его метод:
255258

256259
```php
257260
public function fixtures()
@@ -265,7 +268,7 @@ public function fixtures()
265268
}
266269
```
267270

268-
Запуская каждый раз любой функциональный тест из backend, стартует фикстура UserFixture:
271+
Запуская каждый раз любой функциональный тест из backend, запускается `FixtureHelper`, который загружает фикстуру `UserFixture`:
269272

270273
```php
271274
class UserFixture extends ActiveFixture
@@ -274,13 +277,9 @@ class UserFixture extends ActiveFixture
274277
}
275278
```
276279

277-
, которая очищает таблицу для модели `common\models\User`. А затем заполняет её данными из `dataFile`.
278-
279-
Для кого-то, на первый раз это всё может показаться сложным и избыточным. Ведь мы ушли в сторону, а могли бы за это время
280-
уже создать необходимую форму и двигаться дальше. Но нет, топчемся на месте. Тяжело в учении - легко в бою.
281-
Сделайте паузу, выпейте кофе, расслабитесь. Когда отдохнули - продолжим.
280+
, которая очищает таблицу для модели `common\models\User`, а затем заполняет её данными из `dataFile`.
282281

283-
Создадим новые фикстуры, которые будут сбрасывать состояние таблицы для звёзд, планет и их спутников. Создайте в
282+
Добавим новые фикстуры, которые будут сбрасывать состояние таблицы для звёзд, планет и их спутников. Создайте в
284283
`yii2-app-advanced/tests/codeception/common/fixtures` файлы:
285284

286285
- PlanetFixture.php
@@ -302,7 +301,7 @@ class SatelliteFixture extends ActiveFixture
302301

303302
```
304303

305-
Остальные две: `PlanetFixture` и `StarFixture` создайте самостоятельно.
304+
Код её простой, остальные две: `PlanetFixture` и `StarFixture` создайте самостоятельно.
306305

307306
Без `$dataFile` фикстуры <a href="http://www.yiiframework.com/doc-2.0/yii-test-activefixture.html" target="_blank">ActiveFixture</a>
308307
будут очищать таблицы без внесения первоначальных данных. Явно можно не указывать расположение файла с данными(`$dataFile`),
@@ -334,40 +333,73 @@ public function fixtures()
334333
{
335334
return [
336335
'user' => [
337-
'class' => UserFixture::className(),
338-
'dataFile' => '@tests/codeception/common/fixtures/data/init_login.php',
336+
'class' => UserFixture::className(),
337+
'dataFile' => '@tests/codeception/common/fixtures/data/init_login.php',
339338
],
340339
'star' => [
341-
'class' => tests\codeception\common\fixtures\StarFixture::className(),
340+
'class' => tests\codeception\common\fixtures\StarFixture::className(),
342341
],
343342
'planet' => [
344-
'class' => tests\codeception\common\fixtures\PlanetFixture::className(),
343+
'class' => tests\codeception\common\fixtures\PlanetFixture::className(),
345344
],
346345
'satellite' => [
347-
'class' => tests\codeception\common\fixtures\SatelliteFixture::className(),
346+
'class' => tests\codeception\common\fixtures\SatelliteFixture::className(),
348347
],
349348
];
350349
}
351350
```
352351

353352
<p class="alert alert-info">У <a href="http://www.yiiframework.com/doc-2.0/yii-test-activefixture.html" target="_blank">ActiveFixture</a>
354-
есть свойстов `$depends`, с помощью которого можно также установить порядок связей фикстур.
353+
есть свойство $depends, с помощью которого можно также установить порядок связей фикстур.
355354
</p>
356355

357-
Теперь при запуске теста формы, мы сможем выбрать звезду из выпадающего списка.
356+
Фикстуры созданы, при запуске теста таблицы будут очищаться и заполняться данными из файлов `yii2-app-advanced/tests/codeception/common/fixtures/data/`.
357+
Поэтому теперь при запуске теста формы, мы сможем выбрать звезду из выпадающего списка:
358358

359359
```php
360-
codecept run functional functional/PlanetFormCept.php
361-
362-
Tests\codeception\backend.functional Tests (1) ------
363-
------------------------------------------
364-
Trying to ensure than create form works Ok
365-
-----------------------------------------------------
366-
367-
Time: 1.03 seconds, Memory: 21.50Mb
368-
OK (1 test, 1 assertion)
360+
codecept run functional functional/PlanetFormCept.php
361+
362+
Tests\codeception\backend.functional Tests (1)
363+
Trying to ensure than create form works Ok
364+
365+
Time: 1.03 seconds, Memory: 21.50Mb
366+
OK (1 test, 1 assertion)
367+
```
368+
369+
Если посмотреть в контроллер `yii2-app-advanced/backend/controllers/PlanetController.php`, то в методе `actionCreate`
370+
можно увидеть, что после сохранения происходит переход на действие `view`
371+
372+
```php
373+
return $this->redirect(['view', 'id' => $model->id]);
369374
```
370375

376+
В конце нашего теста указано:
377+
378+
```php
379+
$I->dontSeeInTitle('Новая планета');
380+
```
381+
382+
что не совсем корректно, так как данные могут не сохраниться, появится ошибка, но в этом случае `dontSeeInTitle` вернёт
383+
утвердительный результат и тест выполнится успешно. Лучше заменить эту проверку на:
384+
385+
```php
386+
$I->seeInTitle('Новая Земля');
387+
```
388+
389+
Теперь мы можем смело вносить изменения в код формы и запуская тест видеть, что всё работает корректно. Причём затраты по
390+
времени на проверку составит всего около 1 секунды, в то время как раньше, когда вы проверяли форму самостоятельно через
391+
браузер, уходило куда больше времени. Для закрепления основ самостоятельно напишите тесты к формам для сохранения
392+
звёзд и спутников.
393+
394+
#### Сохранение реляционных данных.
395+
396+
У нас есть три формы для трёх разных моделей. Представьте себе ситуацию: нужно ввести информацию по новой планете, но звезды
397+
у неё ещё нету. Не совсем удобно переключаться с формы на форму, сохраняя новые данные. Давайте объединим работу с тремя
398+
формами в одной. Для этого нам понадобится новая модель формы, которая будет объединять работу с тремя моделями
399+
относительно модели Планет.
400+
401+
371402
#### Дополнительная информация для самостоятельного ознакомления:
372403

373-
- <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/helper-array.md" target="_blank">Руководство по ArrayHelper</a>.
404+
- <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/helper-array.md" target="_blank">Руководство по ArrayHelper</a>.
405+
- <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/test-fixtures.md" target="_blank">Руководство по фикстурам</a>.

0 commit comments

Comments
 (0)