1
- ### Формы для сохранения данных
1
+ ### Сохранение реляционных данных.
2
+
3
+ #### Формы для сохранения данных
2
4
3
5
Вы наверное уже обратили внимание на формы для сохранения:
4
6
@@ -121,16 +123,16 @@ echo $form->field($model, 'planet')->dropDownList($stars);
121
123
Так как формы, для редактирования существующих моделей используются одни и те же, что и для сохранения. То, что-либо новое
122
124
создавать не нужно.
123
125
124
- #### Сохранение реляционных данных.
126
+ #### Проверка работоспособности формы через тест
125
127
126
- У нас есть три формы для трёх разных моделей. Представьте себе ситуацию: нужно ввести информацию по новой планете, но звезды
127
- у неё ещё нету. Не совсем удобно переключаться с формы на форму, сохраняя новые данные. Давайте объединим работу с тремя
128
- формами в одной. Для этого нам понадобится новая модель формы, которая будет объединять работу с тремя моделями
129
- относительно модели Планет .
128
+ В этом подразделе описывается как написать функциональный тест для формы. Такой тест упростит отладку и разработку формы.
129
+ Возможно, вам легче использовать браузер и по сто пятьдесят раз выдумывать и вводить данные, для того, чтобы проверить
130
+ сохранение данных через форму, после очередной правки кода. Если это так, то можете пропустить этот подраздел и перейти
131
+ дальше. Остальным добро пожаловать .
130
132
131
- Давайте начнём с теста. Это упростит отладку и разработку. Будем двигаться небольшими шагами, чтобы было понятнее и легче.
133
+ Будем двигаться небольшими шагами, чтобы было понятнее и легче.
132
134
133
- Создадим функциональный тест ` PlanetFormCept ` :
135
+ Создадим функциональный тест ` PlanetFormCept ` , который будет проверять работу формы для сохранения данных по планетам.
134
136
135
137
```
136
138
cd yii2-app-advanced\tests\codeception\backend\
@@ -139,10 +141,10 @@ codecept build
139
141
140
142
```
141
143
codecept generate:cept functional PlanetFormCept
142
- Test was created in PlanetFormCept.php
144
+ Test was created in ...
143
145
```
144
146
145
- Откройте файл теста ` PlanetFormCept.php ` и измените его содержимое на:
147
+ Откройте созданный файл ` PlanetFormCept.php ` и измените его содержимое на:
146
148
147
149
``` php
148
150
<?php use tests\codeception\backend\FunctionalTester;
@@ -160,8 +162,9 @@ codecept run functional functional/PlanetFormCept.php
160
162
OK (1 test, 0 assertions)
161
163
```
162
164
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 ` с содержимым:
165
168
166
169
``` php
167
170
<?php
@@ -209,7 +212,7 @@ $I = new FunctionalTester($scenario);
209
212
$I->wantTo('ensure than create form works');
210
213
$formPage = \tests\codeception\backend\PlanetFormPage::openBy($I);
211
214
212
- $I->fillField('//*[@id="planet-name"]','Земля');
215
+ $I->fillField('//*[@id="planet-name"]','Новая Земля');
213
216
$I->selectOption('//*[@id="planet-star_id"]', 'Солнце');
214
217
$I->click('//*[@id="w0"]/div[3]/button');
215
218
$I->dontSeeInTitle('Новая планета');
@@ -251,7 +254,7 @@ modules:
251
254
configFile: '../config/backend/functional.php'
252
255
```
253
256
254
- откройте этот файл и найдите его метод:
257
+ Откройте файл помощник ` FixtureHelper.php ` и найдите его метод:
255
258
256
259
``` php
257
260
public function fixtures()
@@ -265,7 +268,7 @@ public function fixtures()
265
268
}
266
269
```
267
270
268
- Запуская каждый раз любой функциональный тест из backend, стартует фикстура UserFixture:
271
+ Запуская каждый раз любой функциональный тест из backend, запускается ` FixtureHelper ` , который загружает фикстуру ` UserFixture ` :
269
272
270
273
``` php
271
274
class UserFixture extends ActiveFixture
@@ -274,13 +277,9 @@ class UserFixture extends ActiveFixture
274
277
}
275
278
```
276
279
277
- , которая очищает таблицу для модели ` common\models\User ` . А затем заполняет её данными из ` dataFile ` .
278
-
279
- Для кого-то, на первый раз это всё может показаться сложным и избыточным. Ведь мы ушли в сторону, а могли бы за это время
280
- уже создать необходимую форму и двигаться дальше. Но нет, топчемся на месте. Тяжело в учении - легко в бою.
281
- Сделайте паузу, выпейте кофе, расслабитесь. Когда отдохнули - продолжим.
280
+ , которая очищает таблицу для модели ` common\models\User ` , а затем заполняет её данными из ` dataFile ` .
282
281
283
- Создадим новые фикстуры, которые будут сбрасывать состояние таблицы для звёзд, планет и их спутников. Создайте в
282
+ Добавим новые фикстуры, которые будут сбрасывать состояние таблицы для звёзд, планет и их спутников. Создайте в
284
283
` yii2-app-advanced/tests/codeception/common/fixtures ` файлы:
285
284
286
285
- PlanetFixture.php
@@ -302,7 +301,7 @@ class SatelliteFixture extends ActiveFixture
302
301
303
302
```
304
303
305
- Остальные две: ` PlanetFixture ` и ` StarFixture ` создайте самостоятельно.
304
+ Код её простой, остальные две: ` PlanetFixture ` и ` StarFixture ` создайте самостоятельно.
306
305
307
306
Без ` $dataFile ` фикстуры <a href =" http://www.yiiframework.com/doc-2.0/yii-test-activefixture.html " target =" _blank " >ActiveFixture</a >
308
307
будут очищать таблицы без внесения первоначальных данных. Явно можно не указывать расположение файла с данными(` $dataFile ` ),
@@ -334,40 +333,73 @@ public function fixtures()
334
333
{
335
334
return [
336
335
'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',
339
338
],
340
339
'star' => [
341
- 'class' => tests\codeception\common\fixtures\StarFixture::className(),
340
+ 'class' => tests\codeception\common\fixtures\StarFixture::className(),
342
341
],
343
342
'planet' => [
344
- 'class' => tests\codeception\common\fixtures\PlanetFixture::className(),
343
+ 'class' => tests\codeception\common\fixtures\PlanetFixture::className(),
345
344
],
346
345
'satellite' => [
347
- 'class' => tests\codeception\common\fixtures\SatelliteFixture::className(),
346
+ 'class' => tests\codeception\common\fixtures\SatelliteFixture::className(),
348
347
],
349
348
];
350
349
}
351
350
```
352
351
353
352
<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, с помощью которого можно также установить порядок связей фикстур.
355
354
</p >
356
355
357
- Теперь при запуске теста формы, мы сможем выбрать звезду из выпадающего списка.
356
+ Фикстуры созданы, при запуске теста таблицы будут очищаться и заполняться данными из файлов ` yii2-app-advanced/tests/codeception/common/fixtures/data/ ` .
357
+ Поэтому теперь при запуске теста формы, мы сможем выбрать звезду из выпадающего списка:
358
358
359
359
``` 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]);
369
374
```
370
375
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
+
371
402
#### Дополнительная информация для самостоятельного ознакомления:
372
403
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