Skip to content

Commit 17aa3ea

Browse files
committed
Merge branch 'master' into step-1.3
2 parents c185a43 + 71c2b19 commit 17aa3ea

File tree

2 files changed

+119
-25
lines changed

2 files changed

+119
-25
lines changed

scripts/steps/step-001.1.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class m150513_054155_create_asto_tables extends Migration
8888
'name' => Schema::TYPE_STRING . ' NOT NULL',
8989
'star_id' => Schema::TYPE_INTEGER . ' NOT NULL',
9090
'FOREIGN KEY(star_id) REFERENCES '
91-
. $this->db->quoteTableName('{{%star}}') . '(id)'
91+
. $this->db->quoteTableName('{{%star}}') . '(id) ON UPDATE CASCADE ON DELETE CASCADE'
9292
],
9393
$tableOptions
9494
);
@@ -100,7 +100,7 @@ class m150513_054155_create_asto_tables extends Migration
100100
'name' => Schema::TYPE_STRING . ' NOT NULL',
101101
'planet_id' => Schema::TYPE_INTEGER . ' NOT NULL',
102102
'FOREIGN KEY(planet_id) REFERENCES '
103-
. $this->db->quoteTableName('{{%planet}}') . '(id)'
103+
. $this->db->quoteTableName('{{%planet}}') . '(id) ON UPDATE CASCADE ON DELETE CASCADE'
104104
],
105105
$tableOptions
106106
);

scripts/steps/step-001.3.md

Lines changed: 117 additions & 23 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,10 +301,105 @@ class SatelliteFixture extends ActiveFixture
302301

303302
```
304303

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+
#### Сохранение реляционных данных.
306395

396+
У нас есть три формы для трёх разных моделей. Представьте себе ситуацию: нужно ввести информацию по новой планете, но звезды
397+
у неё ещё нету. Не совсем удобно переключаться с формы на форму, сохраняя новые данные. Давайте объединим работу с тремя
398+
формами в одной. Для этого нам понадобится новая модель формы, которая будет объединять работу с тремя моделями
399+
относительно модели Планет.
307400

308401

309402
#### Дополнительная информация для самостоятельного ознакомления:
310403

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

Comments
 (0)