我一直在创建一些测试,试图在数据库中的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'],
];
}
}