
M
23.06.2017
05:55:53


Oleg
23.06.2017
05:56:33
да class UserAccountsFields extends ActiveRecord
{
private $_old_password;
public static function tableName(){
return 'user_accounts_fields';
}
public function behaviors(){
return [
'TimestampBehavior' => [
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
],
'BlameableBehavior' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'created_by',
'updatedByAttribute' => 'updated_by',
],
];
}

Vladislav
23.06.2017
05:56:55
используй тройное `
чтоб код вставлять

Google

M
23.06.2017
05:57:17
Покажи что в beforeInsert()

Oleg
23.06.2017
05:57:20

Vladislav
23.06.2017
05:57:31
MyClass
{
private $app;
public function()
}
monospace получается

Oleg
23.06.2017
05:58:16
["_events":"yii\base\Component":private]=>
array(2) {
["beforeInsert"]=>
array(2) {
[0]=>
array(2) {
[0]=>
array(2) {
[0]=>
object(yii\behaviors\TimestampBehavior)#146 (6) {
["createdAtAttribute"]=>
string(10) "created_at"
["updatedAtAttribute"]=>
string(10) "updated_at"
["value"]=>
NULL
["attributes"]=>
array(2) {
["beforeInsert"]=>
array(2) {
[0]=>
string(10) "created_at"
[1]=>
string(10) "updated_at"
}
["beforeUpdate"]=>
array(1) {
[0]=>
string(10) "updated_at"
}
}
["skipUpdateOnClean"]=>
bool(true)
["owner"]=>
*RECURSION*
}
[1]=>
string(18) "evaluateAttributes"
}
[1]=>
NULL
}

M
23.06.2017
05:58:48
Что ты мне скидываешь, метод покажи.

Oleg
23.06.2017
06:00:22

M
23.06.2017
06:02:05
я его не прописывал...
Я Timestamp/Blameable behavior одной строкой подключаю, и ты попробуй
public function behaviors(){
return [
TimestampBehavior::class,
BlameableBehavior::class,
];
}

Vladislav
23.06.2017
06:02:56
скнь код всей модели в fiddle

M
23.06.2017
06:02:57
Сам подумай, зачем кофигурировать что-либо, если оно не отличается от значений по умолчанию.

Vladislav
23.06.2017
06:02:59
и дай ссылку

Oleg
23.06.2017
06:03:28
дело в том, что в соседнем проекте тоже самое и там все работает, мне нужно их именовать, для того. что бы иметь возможность его отключить

M
23.06.2017
06:03:33
Я вангую у него переопределен beforeSave, а там не дернул parent из-за чего евент не триггается

Google

Oleg
23.06.2017
06:03:47
ща

M
23.06.2017
06:04:17

Oleg
23.06.2017
06:08:47
https://pastebin.com/8aYukSrD

M
23.06.2017
06:09:33
Или вырезал код?

Pavel
23.06.2017
06:10:11
useless beforeSave

M
23.06.2017
06:10:39

Pavel
23.06.2017
06:10:58
ну да

M
23.06.2017
06:11:22

Vladislav
23.06.2017
06:14:07
в рулезах описаны все поля?
или есть поле, которое есть в базе, но нет в рулезах?

Pavel
23.06.2017
06:14:25
https://pastebin.com/8aYukSrD
Если код у теб в точности такой, то все должно работать. Если нет и beforeSave имеет отличные значения - проблема в нем. И как справедливо заметил M K, если запись не сохранилась в БД в принципе, то косяк при вализации

Vladislav
23.06.2017
06:14:31
сделай в мускле show create table user_accounts_fields;
и вылей сюда
или любой другой способ

Oleg
23.06.2017
06:15:26
отбой, ступил в саблайме через rmate сессия отвалилась дело было в parent::beforeSave($insert)
?
всем спасибо за помощь! ? ?

Vladislav
23.06.2017
06:16:17
напереопределялся =)

M
23.06.2017
06:18:06
Но я вам их не дам ?

Google

M
23.06.2017
06:18:21
Как обычно начнётся срач)

Oleg
23.06.2017
06:19:02
будет весело :)

M
23.06.2017
06:26:11
Блин, когда начинаю в проекте писать RAW запросы сложные - понимаю, что дальше будет ппц)
Негативный опыт)

Pavel
23.06.2017
06:39:56
вот у меня сечас задача с запросом на 350+ строк. Это можно считать сложным?

Pavel
23.06.2017
06:42:48
Не всегда plain-sql - зло. имхо

Konstantin
23.06.2017
06:48:42
Привет

Эд
23.06.2017
06:48:50
Не больше

Olga
23.06.2017
06:59:35
привет!
как мокать в функциональных тестах?
тест типа
$I = new FunctionalTester($scenario);
$I->wantTo('check login a new user');
$email = 'test@email.com';
$I->sendPOST('users', [
'email' => $email,
'password' => '123456',
]);
$I->canSeeResponseContainsJson(['email' => $email]);
например, внутри регистрации у меня дергается сторонний сервис (внешнее API), я не хочу, чтобы при каждом прогоне тестов дергалось внешнее апи, а отдавало какой-то мок

Vladislav
23.06.2017
07:00:28
напиши json ответа и сунь в файл

Konstantin
23.06.2017
07:01:08
Крутое платье ?

Vladislav
23.06.2017
07:01:32
во время sendPOST дергается апи?

SiZE
23.06.2017
07:01:32

Vladislav
23.06.2017
07:02:39
если да,то тебе надо сендПОСТ абстрагировать
вернее интерфейс подключения к апи абстрагировать
и передавать в конструктор или типа того
и для тестов создать фейковый интерфейс

Olga
23.06.2017
07:03:47
во время sendPOST дергается апи?
ну да, во время регистрации, например загружаем данные куда-то. в регистрации вызывает какой-нибудь UserDataService и внутри льем на стронее апи

Vladislav
23.06.2017
07:03:54
который будет отдавать мок

Google

Vladislav
23.06.2017
07:04:08
оторви сам запрос к апи от sendPOST
и передавай его в сендПОСТ при запросе или при конструкторе
as u wish
остальнео выше описал

Admin
ERROR: S client not available

Vladislav
23.06.2017
07:04:59
типа напиши класс APIRequest
с методом request
ипа того
и этот метод реквест возвращает данные
после, перед запросом sendPOST создаешь экземпляр APIRequest

Olga
23.06.2017
07:05:59
так можно сделать, если делать типа через unit тесты, можно даже сам сервис замокать ($this->createMock там) , передать его как зависимость и все ок. но это тогда не тот вид тестов, который я хочу сейчас реализовать

Vladislav
23.06.2017
07:06:02
и пердаешь его sendPOSTу
ааа
так тебе костыль нужен
а не как надо)
ничего кроме хардкоджинга внутри sendPOST не могу придумать

Olga
23.06.2017
07:06:35
да почему костыль, я хочу понять как правильно

Vladislav
23.06.2017
07:06:55
правильно подключать запрос к стороннему апи через dependency uinjection\
или через set
чтоб потом тестить можно было

Google

Vladislav
23.06.2017
07:07:38
иначе хардкод внтури метода
типа, если передали параметр isTest, то не делаем запрос
а возвращаем данные сразу

Olga
23.06.2017
07:08:03
получается, что вообще нет возможности изолированно протестировать, через такой синтаксис
$I = new FunctionalTester($scenario);
$I->wantTo('check login a new user');
$I->sendPOST...
если у меня есть хотя бы одна стороняя зависимость? ээээ ну странно же это
я не очень разобралась в фикстурах, нельзя их как-то запользовать для мока сервиса?

Vladislav
23.06.2017
07:08:39
Можно, но архитектура заранее даолжна поддерживать абсрагированность от реальности
а сейчас у тебя sendPOST полностью завязан на внешнем АПИ
именно внутрях
а повлиять на метод из теста нельзя никак по определению

Olga
23.06.2017
07:10:43
поняла, т.е. типа если я хочу, чтобы это дело сработало. мне надо как-то методу сообщить, что это вообще-то тест. например, посмотрев YII_ENV
мне это не очень нравится, конечно. я думала, что может можно подменить класс

Vladislav
23.06.2017
07:11:22
подменить класс через dependency injection как раз таки можно
на проде передается класс реального запроса
на тестах тобой сгенеренный
лол, 404 участника группы

Владислав
23.06.2017
07:12:10
:)