TDD Laravel — проверка функциональности в laravel и spatie / laravel-activitylog выявляют ошибки кодирования JSON

Я пишу некоторые тесты для своих моделей в laravel, и у меня возникают проблемы, когда я включаю Журнал активности с помощью spatie / Laravel-activitylog.

Итак, я создаю пользователя, используя Factory, я аутентифицируюсь в системе, и когда я пытаюсь выйти из системы, я получаю эту ошибку:

1) Тесты \ Feature \ Usuario \ CriarUsuarioTest :: testAcessaPaginaDeRegistro
Осветить \ Database \ Eloquent \ JsonEncodingException: невозможно кодировать атрибут [свойства] для модели [Spatie \ Activitylog \ Models \ Activity] в JSON: тип не поддерживается.

Мой тест TestCase.php:

protected function setUp()
{
parent::setUp();
$this->user = create('App\Models\Usuario');
$this->singIn($this->user)
->disableExceptionHandling();

}

...
...
...

protected function singIn($user)
{
$this->actingAs($user);
return $this;
}

protected function singOut()
{
// routeLogout() goes to '/logout' route.
$this->post(routeLogout()); // <- Here, where the error occurs
return $this;
}

мой App/Models/Usuario.php модель:

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Webpatser\Uuid\Uuid;
use Spatie\Activitylog\Traits\LogsActivity;

class Usuario extends Authenticatable
{
use LogsActivity, Notifiable, SoftDeletes;
protected $table = 'usuario';
protected $fillable = [/*...*/] ; // I remove this to post here on SO
protected static $logFillable = true;
public $timestamps = true;
protected $dates = [
'created_at',
'updated_at',
'deleted_at'
];
protected static function boot()
{
// Handle the \LogsActivity boot method
parent::boot();
static::saving(function ($usuario){
$usuario->uuid = Uuid::generate()->string;
});
}
public function getRouteKeyName()
{
return 'uuid';
}
}

мой config/activitylog.php файл:

return [
'enabled' => env('ACTIVITY_LOGGER_ENABLED', true),
'delete_records_older_than_days' => 365,
'default_log_name' => 'default',
'default_auth_driver' => null,
'subject_returns_soft_deleted_models' => false,
'activity_model' => \Spatie\Activitylog\Models\Activity::class,
];

мой phpunit.xml файл:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"backupStaticAttributes="false"bootstrap="vendor/autoload.php"colors="true"convertErrorsToExceptions="true"convertNoticesToExceptions="true"convertWarningsToExceptions="true"processIsolation="false"stopOnFailure="false">
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="API_DEBUG" value="true"/>
<env name="memory_limit" value="512M"/>
<env name="APP_DATABASE" value="test"/>
</php>
</phpunit>

мой create_activity_log_migration файл:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateActivityLogTable extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::create('activity_log', function (Blueprint $table) {
$table->increments('id');
$table->string('log_name')->nullable();
$table->string('description');
$table->integer('subject_id')->nullable();
$table->string('subject_type')->nullable();
$table->integer('causer_id')->nullable();
$table->string('causer_type')->nullable();
$table->text('properties')->nullable();
$table->timestamps();

$table->index('log_name');
});
}

/**
* Reverse the migrations.
*/
public function down()
{
Schema::drop('activity_log');
}
}

Затем я замечаю, когда я отключаю журнал активности для модели, он работает нормально. И, когда я использую систему с помощью повозки или браузера, журналы также работают.

4

Решение

Я не смог воспроизвести ошибку, но у меня есть некоторые соображения:

  • Вы говорите, что ошибка возникает при публикации на маршруте выхода из системы, но это не должно вызывать регистратор активности, верно? Я имею ввиду нет created, updated или же deleted события там происходят.
  • Вместо этого created Событие действительно срабатывает при создании пользователя с фабрикой. Это, в свою очередь, запускает журнал активности.
  • Когда регистратор пытается создать новый Activity вы получаете исключение Illuminate\Database\Eloquent\JsonEncodingException: Unable to encode attribute [properties] for model [Spatie\Activitylog\Models\Activity] to JSON: Type is not supported., Это почти наверняка Illuminate\Database\Eloquent\Concerns\HasAttributes@castAttributeAsJson метод, который делает простой json_encode на значение атрибута.
  • JSON_ERROR_UNSUPPORTED_TYPE — json_encode (), например, ресурс, было присвоено значение неподдерживаемого типа.

  • Значение кодируется. Может быть любого типа, кроме ресурса.

  • Таким образом, есть ли шанс, что ресурс является частью properties войти? пытаться dd($user->attributeValuesToBeLogged('created')) только после создания пользователя.
1

Другие решения

Я нашел ответ (но я не знаю, является ли это лучшим способом решить эту проблему);

Просто положив $this->createApplication(); в SetUp метод, внутри TestCase.php файл, ошибка исчезнет.

Спасибо всем вам, ребята.

0