deleteのテストメソッドでは、deleteやdestroyではなくassertCountで確認するので注意が必要
### PHPUnit delete
/tests/Feature/BookReservationTest.php
public function test_a_book_can_be_deleted(){ $this->withoutExceptionHandling(); $this->post('/books', [ 'title' => 'Cool Title', 'author' => 'Victor' ]); $book = Book::first(); $this->assertCount(1, Book::all()); $response = $this->delete('/books/'. $book->id); $this->assertCount(0, Book::all()); $response->assertRedirect('/books'); }
$ phpunit –filter test_a_book_can_be_deleted
route
Route::delete('/books/{book}', 'BooksController@destroy');
BooksController.php
public function destroy(Book $book){ $book->delete(); return redirect('/books'); }
$ phpunit –filter test_a_book_can_be_deleted
OK (1 test, 2 assertions)
### modelによるpath()の関数化
Book.php
use Illuminate\Support\Str; public function path(){ return '/books/' . $this->id . '-' . Str::slug($this->title); }
BooksController.php
return redirect($book->path());
BookReservationTest.php
// test methodも同様に使う
public function testa_book_can_be_added_to_the_library(){ $this->withoutExceptionHandling(); $response = $this->post('/books', [ 'title' => 'Cool book Title', 'author' => 'victor', ]); $book = Book::first(); $this->assertCount(1, Book::all()); $response->assertRedirect($book->path()); }
‘/${dirName}/’ . $this->id はよく使う書き方なので、modelにまとめるとすっきりする