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,10 +301,105 @@ class SatelliteFixture extends ActiveFixture
302
301
303
302
```
304
303
305
- Остальные две: ` PlanetFixture ` и ` StarFixture ` создайте самостоятельно.
304
+ Код её простой, остальные две: ` PlanetFixture ` и ` StarFixture ` создайте самостоятельно.
305
+
306
+ Без ` $dataFile ` фикстуры <a href =" http://www.yiiframework.com/doc-2.0/yii-test-activefixture.html " target =" _blank " >ActiveFixture</a >
307
+ будут очищать таблицы без внесения первоначальных данных. Явно можно не указывать расположение файла с данными(` $dataFile ` ),
308
+ а просто его создать в той же директории, где лежит фикстура, с учётом имени таблицы. Т.е. для фикструры ` SatelliteFixture `
309
+ нужно создать в директории ` yii2-app-advanced/tests/codeception/common/fixtures/data ` файл с именем ` satellite.php ` . Для
310
+ вашего удобства эти файлы уже созданы заранее.
311
+
312
+ Фикстуры созданы, теперь нужно определить порядок их загрузки. Если мы сначала начнём загружать фикстуру для таблицы планет,
313
+ то споткнёмся на ограничение внешних ключей в базе данных, т.е. вставляя данные из ` yii2-app-advanced/tests/codeception/common/fixtures/data/planet.php `
314
+
315
+ ``` php
316
+ return [
317
+ [
318
+ 'name' => 'Земля',
319
+ 'star_id' => '1',
320
+ ],
321
+ ];
322
+ ```
323
+
324
+ получим ошибку
325
+
326
+ > SQLSTATE[ 23000] : Integrity constraint violation: 19 FOREIGN KEY constraint failed
327
+
328
+ которая обозначает, что звезды с ID = 1 не найдено. Поэтому сначала нужно загрузить фикстуру для звезды,
329
+ затем для планеты и на последок фикстуру для спутников. Подключаем загрузку фикстур в файле помощнике FixtureHelper:
330
+
331
+ ``` php
332
+ public function fixtures()
333
+ {
334
+ return [
335
+ 'user' => [
336
+ 'class' => UserFixture::className(),
337
+ 'dataFile' => '@tests/codeception/common/fixtures/data/init_login.php',
338
+ ],
339
+ 'star' => [
340
+ 'class' => tests\codeception\common\fixtures\StarFixture::className(),
341
+ ],
342
+ 'planet' => [
343
+ 'class' => tests\codeception\common\fixtures\PlanetFixture::className(),
344
+ ],
345
+ 'satellite' => [
346
+ 'class' => tests\codeception\common\fixtures\SatelliteFixture::className(),
347
+ ],
348
+ ];
349
+ }
350
+ ```
351
+
352
+ <p class =" alert alert-info " >У <a href =" http://www.yiiframework.com/doc-2.0/yii-test-activefixture.html " target =" _blank " >ActiveFixture</a >
353
+ есть свойство $depends, с помощью которого можно также установить порядок связей фикстур.
354
+ </p >
355
+
356
+ Фикстуры созданы, при запуске теста таблицы будут очищаться и заполняться данными из файлов ` yii2-app-advanced/tests/codeception/common/fixtures/data/ ` .
357
+ Поэтому теперь при запуске теста формы, мы сможем выбрать звезду из выпадающего списка:
358
+
359
+ ``` php
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]);
374
+ ```
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
+ #### Сохранение реляционных данных.
306
395
396
+ У нас есть три формы для трёх разных моделей. Представьте себе ситуацию: нужно ввести информацию по новой планете, но звезды
397
+ у неё ещё нету. Не совсем удобно переключаться с формы на форму, сохраняя новые данные. Давайте объединим работу с тремя
398
+ формами в одной. Для этого нам понадобится новая модель формы, которая будет объединять работу с тремя моделями
399
+ относительно модели Планет.
307
400
308
401
309
402
#### Дополнительная информация для самостоятельного ознакомления:
310
403
311
- - <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