Передача параметров в модульном тесте, обновление функции в базе данных CRUD Laravel

Я создал несколько тестов, чтобы попробовать создать функции редактирования удаления в laravel из моей базы данных, это мой код:

ConsituencyController.php:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreConstituencyRequest;
use App\Http\Resources\ConstituencyResource;
use App\Models\Constituency;
use Illuminate\Http\Request;
use phpDocumentor\Reflection\Types\Collection;

class ConstituencyController extends Controller
{


    /**
     * Display a listing of the constituencies.
     *
     *
     */
    public function index()
    {
        $constituency = Constituency::all();

        return ConstituencyResource::collection($constituency);
    }



    /**
     * Show the form for creating a new resource.
     *
     *
     */
    public function create()
    {
        //
    }



    /**
     * Store a newly created constituency in storage.
     *
     * @param Request $request
     *
     */
    public function store(Request $request)
    {
        $name = $request->name;
        $data = array("name"=>$name);

        Constituency::insert($data);
    }



    /**
     * Display the specified constituency.
     *
     * @param  int $id
     *
     */
    public function show(int $id)
    {
        $constituency = Constituency::find($id);

        return new ConstituencyResource($constituency);
    }



    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     *
     */
    public function edit(int $id)
    {
        //
    }



    /**
     * Update the specified constituency in storage.
     *
     * @param Request $request
     * @param  int  $id
     *
     */
    public function update(Request $request, int $id)
    {
        $constituency = Constituency::find($id);
        $constituency->name = $request->name;

        $constituency->update();
    }



    /**
     * Remove the specified constituency from storage.
     *
     * @param  int  $id
     *
     */
    public function destroy(int $id)
    {
        Constituency::find($id)->delete();
    }
}

избирательный округ.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Constituency extends Model
{
    use HasFactory;

    public function candidate()
    {
        return $this->hasMany(Candidate::class);
    }

    public function town()
    {
        return $this->hasMany(Town::class);
    }
}

ConstituencyResource.php:

    <?php
    
    namespace App\Http\Resources;
    
    use Illuminate\Http\Resources\Json\JsonResource;
    
    class ConstituencyResource extends JsonResource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
         */
        public function toArray($request)
        {
            return [
                'id' => $this->id,
                'name' => $this->name,
                'created_at' => $this->created_at,
                'updated_at' => $this->updated_at,
            ];
        }
    
    
    }

ConstituencyFactory.php:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Constituency>
 */
class ConstituencyFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            'name' => $this->faker->word(),
        ];
    }
}

Теперь это мой тест для обновления избирательного округа:

public function test_a_constituency_can_be_modified()
    {
        $constituency = Constituency::factory()->create();
        $constituency_id = $constituency->id;

        $response = $this->put('api/constituencies/'.$constituency_id);

        $this->assertDatabaseHas('constituencies', [
            'id' => $constituency->id,
            'name' => $constituency->name,
            'created_at' => $constituency->created_at,
            'updated_at' => $constituency->updated_at,
        ]);
    }

Теперь, конечно, тест проходит, но на самом деле я не даю ему какие-то новые параметры для изменения... Я пытался дать некоторые параметры функции, чтобы фактически изменить некоторые данные, но я не могу понять, как это сделать это.... Я не думаю, что мне придется указывать параметры в URI, но где тогда?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете PHPUnit, вы, вероятно, захотите использовать Поставщики данных:

Пример из документов

/**
 * @dataProvider additionProvider
 */
public function testAdd(int $a, int $b, int $expected): void
{
    $this->assertSame($expected, $a + $b);
}

public function additionProvider(): array
{
    return [
        'adding zeros'  => [0, 0, 0],
        'zero plus one' => [0, 1, 1],
        'one plus zero' => [1, 0, 1],
        'one plus one'  => [1, 1, 3]
    ];
}

У умных ребят из Tighten тоже есть отличный учебник по поставщикам данных.

Если вы используете ВРЕДИТЕЛЬ, вам понадобится Наборы данных.

Пример из документов

dataset('emails', [
    '[email protected]',
    '[email protected]'
]);

it('has emails', function ($email) {
    expect($email)->not->toBeEmpty();
})->with('emails');  // <-- use the dataset

Использование поставщиков данных и наборов данных позволяет вам повторно использовать данные, а также проверять их на множестве входных данных для вашего модульного теста. Вы могли бы, если бы вы хотели просто жестко закодировать значение после оператора аранжировки (где вы создаете запись БД), но это имеет ограничения, и поставщики гораздо более гибкие.

Обновление — пример теста

Ниже приведен пример того, как вы можете действовать. Обратите внимание, что это не является исчерпывающим, и такие вещи, как использование $request->all() для обновления вашей модели, не рекомендуется, но я сделал это, чтобы не усложнять для иллюстративных целей. Это должно дать вам представление о том, где и как вы можете провести тестирование. Есть много способов/мнений по таким вещам.

API.php

Route::put('/constituencies/{constituency}', 
    [ConstituencyController::class, 'update']
)->name('api.constituencies.update');

ConsituencyController.php

<?php

namespace App\Http\Controllers;

use App\Models\Constituency;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class ConstituencyController extends Controller
{
    public function update(Request $request, Constituency $constituency)
    {
        $constituency->update($request->all());

        return response()->json($constituency, Response::HTTP_OK);
    }
}

ПримерTest.php

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\Constituency;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @test
     * @dataProvider constituencyNameProvider
     * @return void
     */
    public function it_can_update_constituency_name_successfully($constituencyName)
    {
        // Arrange
        $constituency = Constituency::factory()->create();
        $payload = ['name' => $constituencyName];

        // Act
        $response = $this->put(route('api.constituencies.update', $constituency->id), $payload);

        // Assert
        $response->assertStatus(Response::HTTP_OK)
            ->assertJson([
                'id' => $constituency->id,
                'name' => $constituencyName
            ])
            ->assertJsonStructure([
                'id', 'name', 'created_at', 'updated_at'
            ]);
    }

    public function constituencyNameProvider(): array
    {
        return [
            ['Ostwald'],
            ['Springtown'],
            ['Baybarrow'],
            ['Blackhaven'],
            ['Lochspring'],
        ];
    }
}

Дело в том, что я просто не знаю, куда вставить данные, которые я хочу изменить в своем коде, чтобы обновить строку в моей базе данных. Я вызываю свою функцию с помощью URI и «пути», но где я должен фактически поместить свой поставщик данных, например, чтобы мой код изменял строку в базе данных в зависимости от данных в поставщике данных?

Lilian Carion 04.04.2022 10:12

@LilianCarion Я обновил свой ответ примером для вас.

Peppermintology 04.04.2022 11:34

Другие вопросы по теме