在单元测试中传递参数,在数据库CRUD Laravel中更新函数



我一直在创建一些测试,试图在数据库中的laravel上创建删除编辑函数,这是我的代码:

ConstituencyController.php:

<?php
namespace AppHttpControllers;
use AppHttpRequestsStoreConstituencyRequest;
use AppHttpResourcesConstituencyResource;
use AppModelsConstituency;
use IlluminateHttpRequest;
use phpDocumentorReflectionTypesCollection;
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();
}
}

Constituency.php:

<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
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 AppHttpResources;

use IlluminateHttpResourcesJsonJsonResource;

class ConstituencyResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param  IlluminateHttpRequest  $request
* @return array|IlluminateContractsSupportArrayable|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 DatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
/**
* @extends IlluminateDatabaseEloquentFactoriesFactory<AppModelsConstituency>
*/
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中,但那在哪里呢?

如果您正在使用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]
];
}

"拧紧"的聪明人也有一个关于数据提供商的优秀教程。

如果您正在使用PEST,那么您将需要数据集。

文档示例

dataset('emails', [
'enunomaduro@gmail.com',
'other@example.com'
]);
it('has emails', function ($email) {
expect($email)->not->toBeEmpty();
})->with('emails');  // <-- use the dataset

使用数据提供程序和数据集可以重用数据,但也可以针对单元测试的多个输入进行测试。如果您只想在arrange语句(创建DB记录的地方(之后硬编码一个值,您可以这样做,但这有局限性,而且提供者要灵活得多。

更新-示例测试

下面是一个你如何处理事情的例子。请注意,这并不是详尽无遗的,使用$request->all()来更新模型是不可取的,但我这样做是为了让事情变得简单,以达到虚幻的目的。这应该让你知道在哪里/如何进行测试。对这些事情有很多看法。

api.php

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

ConstituencyController.php

<?php
namespace AppHttpControllers;
use AppModelsConstituency;
use IlluminateHttpRequest;
use SymfonyComponentHttpFoundationResponse;
class ConstituencyController extends Controller
{
public function update(Request $request, Constituency $constituency)
{
$constituency->update($request->all());
return response()->json($constituency, Response::HTTP_OK);
}
}

ExampleTest.php

<?php
namespace TestsFeature;
use TestsTestCase;
use AppModelsConstituency;
use SymfonyComponentHttpFoundationResponse;
use IlluminateFoundationTestingRefreshDatabase;
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'],
];
}
}

最新更新