我正在尝试在Laravel应用中为Note模型创建一个简单的phpunit测试。我只是想测试对特定笔记实例的get请求将显示该笔记的某些属性。
我有一个Note模型,工厂,控制器和路线。
模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Note extends Model
{
protected $guarded = [];
public function path()
{
return "/notes/{$this->id}";
}
}
工厂
use Faker\Generator as Faker;
$factory->define(App\Note::class, function (Faker $faker) {
return [
'title' => $faker->sentence,
'body' => $faker->paragraph,
];
});
路线
Route::get('/notes/{note}', 'NotesController@show');
控制器
namespace App\Http\Controllers;
use App\Note;
use Illuminate\Http\Request;
class NotesController extends Controller
{
public function show(Note $note)
{
return view('notes.show', compact('note'));
}
}
测试
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class NotesTest extends TestCase
{
use WithFaker, RefreshDatabase;
/** @test */
public function a_user_can_view_a_note()
{
$this->withoutExceptionHandling();
$note = factory('App\Note')->create();
// dd($note->path());
$this->get($note->path())
->assertSee($note->title)
->assertSee($note->body);
}
}
运行a_user_can_view_a_note
测试时,出现此错误:
1)测试\功能\注释测试:: a_user_can_view_a_note Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException:GET http://shepherding.test/1
它不是在寻找http://shepherding.test/notes/1
,而是在寻找http://shepherding.test/1
。
PS:dd($note->path());
给出"/notes/1".
我可以将$this->get($note->path())
替换为:
$this->get('/notes/' . $note->id);
或什至将其替换为该硬编码值:
$this->get('/notes/1');
但是测试一直在尝试获取http://shepherding.test/1
。
我不知道为什么将/notes/
从get请求中剥离出来。
我还有其他用于索引的测试,并存储它们都可以正常工作。只是这个显示了这种行为。