У меня проблема с тестированием функций в Laravel. У меня есть стандартный CRUD (Json API) для модели проекта, и я хочу обновить данные проекта.
В Postman все работает хорошо, но когда я запускаю тест, метод PATCH работает как положено, но когда я использую Метод GET, данные выглядят так, как будто они не были обновлены. Более того, когда я получаю данные проекта из базы данных, они выглядят обновленными.
Поэтому моя проблема в том, что после использования метода PATCH в модели проекта данные в базе данных обновляются, но когда я использую метод GET (только в этом тест) Я все еще получаю старые данные вместо обновленных.
Таблица проекта
Schema::create('projects', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->unique();
$table->text('description')->nullable();
$table->unsignedBigInteger('created_by');
$table->timestamps();
$table->foreign('created_by')
->references('id')->on('users');
});
Контроллер проекта
class ProjectController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$projects = Auth::user()->projects;
return JsonResponse::sendSuccessResponse($projects->toArray());
}
/**
* Update the specified resource in storage.
*
* @param UpdateProject $request
* @param Project $project
* @return \Illuminate\Http\Response
*/
public function update(UpdateProject $request, Project $project)
{
$this->authorize('update', $project);
$request->validated();
$project->fill(request(['name', 'description']));
$project->save();
$project->assigned_users()->sync(request('assigned_users'));
$project->assigned_users()->syncWithoutDetaching(Auth::user()->id);
return JsonResponse::sendSuccessResponse($project->toArray());
}
}
Запрос UpdateProject
class UpdateProject extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => ['required', 'string', 'max:255', 'unique:projects,name,' . $this->project->id],
'description' => ['string'],
'assigned_users' => ['exists:users,id'],
'assigned_users.*' => ['distinct']
];
}
}
IndexProjectTest
Список всех работ по тестированию проекта.
//WORKS WELL
class IndexProjectTest extends ProjectTestCase
{
use RefreshDatabase;
/** @test */
public function user_can_see_projects_assigned_to_him()
{
$project = factory(Project::class)->create();
$project->assigned_users()->attach($this->user);
$this->seeProjectInIndexRoute($project);
}
}
UpdateProjectTest
class UpdateProjectTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function user_can_update_project_that_is_assigned_to_him()
{
$project = factory(Project::class)->create();
$project->assigned_users()->attach($this->user);
$newProjectData = factory(Project::class)->make();
$response = $this->patchJson('api/projects/' . $project->id, [
'name' => $newProjectData->name,
'description' => $newProjectData->description
]);
$response
->assertStatus(200)
->assertJsonStructure([
'success',
'data' => [
'created_at',
'created_by',
'description',
'id',
'name'
],
])
->assertJsonMissingValidationErrors(
[
'name'
]
)
->assertJsonFragment([
'name' => $newProjectData->name,
'description' => $newProjectData->description
]);
$response = $this->getJson('api/projects');
dd([
'inList' => $response->getData()->data[0]->name,
'toWhatWeWantedToChange' => $newProjectData->name,
'database' => Project::all()->first()->name,
'descriptionBeforeChange' => $project->name,
'usersProjects' => $this->user->projects->first()->name
]);
}
Возврат с консоли
$ ./vendor/bin/phpunit
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.
array:5 [
"inList" => "atque"
"toWhatWeWantedToChange" => "earum"
"database" => "earum"
"descriptionBeforeChange" => "atque"
"usersProjects" => "earum"
]