Я новичок в Laravel, но не понимаю, как получить представление в TestCase.
В настоящее время у меня есть этот код в моем классе TestCase:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Mail\ContactMail;
use App\Models\Contact;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Http;
class ContactTest extends TestCase
{
use WithFaker;
private $appName;
protected function setUp(): void
{
parent::setUp();
$this->setUpFaker();
}
/**
* Test page HTTP status
*
* @return void
*/
public function test_status()
{
$response = $this->get('/contact');
$response->assertStatus(200);
}
/**
* Test form post
*
* @return void
*/
public function test_form_post()
{
$contactSubjects = Contact::all();
$messageContent = $this->faker->paragraphs(3, true);
// Invalid request
// $response = $this->post('/contact', [
$response = $this->call('POST', 'contact', [
'email' => $this->faker->text(), // invalid mail
'object' => $this->faker->numberBetween(count($contactSubjects)+10, count($contactSubjects)+100), // Be sure we have a number greater than last contact object id
'message_contact' => $messageContent
]);
$response->assertViewIs('contact'); // RESPONSE IS NOT A VIEW
// Valid request
// $response = $this->post('/contact', [
$response = $this->call('POST', 'contact', [
'email' => $this->faker->email(), // valid mail
'object' => $contactSubjects[rand(0, count($contactSubjects)-1)]->id, // Be sure we have a valid contact object ID
'message_contact' => $messageContent
]);
$response->assertViewIs('contact-validate'); // RESPONSE IS NOT A VIEW
}
}
Как видите, я пытаюсь использовать $response = $this->post('/contact', [
и $response = $this->call('POST', 'contact', [
, но получаю ту же ошибку.
Я хочу протестировать представление, потому что я думаю, что это самый точный способ определить, есть ли в моем представлении ошибка, потому что отображаемое представление не то же самое, есть ли у меня ошибка или нет.
Это мой класс контроллера:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreContactRequest;
use App\Models\Contact;
use Illuminate\Support\Facades\Mail;
use App\Mail\ContactMail;
class ContactController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$page = 'contact';
return view($page, [
'page' => $page,
'objects' => Contact::all(),
'error_sending' => false
]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\StoreContactRequest $request
* @return \Illuminate\Http\Response
*/
public function store(StoreContactRequest $request)
{
// Send mail
try {
Mail::to(config('mail.from.address'))->send(new ContactMail($request));
}
catch(\Throwable $e) {
return view('contact', [
'page' => 'contact',
'objects' => Contact::all(),
'error_sending' => 'Une erreur est survenue durant l\'envoie du mail. Merci de ré-essayer plus tard.<br><br>'.$e->getMessage()
]);
}
// Render view
return view('contact-validate', [
'page' => 'contact'
]);
}
}
И это мой файл маршрута (web.php):
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ContactController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
$page = 'home';
return view($page, ['page' => $page]);
});
Route::resource('/contact', ContactController::class);
Что я пропустил? Вам нужно больше кода, чтобы ответить?
Нет, я отображаю контактную проверку только в том случае, если сообщение формы в порядке. Я проверяю два случая: если все в порядке, а если нет. И в двух случаях у меня есть ответ на сообщение, это не представление...
Вы можете отключить обработку исключений, чтобы увидеть результат.
/**
* Test page HTTP status
*
* @return void
*/
public function test_status()
{
$this->withoutExceptionHandling();
$response = $this->get('/contact');
$response->assertStatus(200);
}
Может будет полезно Модульный тест Laravel (ответ не является представлением)
Я уже видел этот пост, но не понимаю цели: почему исключение hiddind правильное и изменить проверку? Кроме того, у меня есть другая проблема (требуется): электронная почта должна быть действительным адресом электронной почты. (и еще 1 ошибка) Конечно, это плохое электронное письмо, но как я могу это проверить?
Просто чтобы быть уверенным: я поместил эту строку в функцию setUp() или в свою тестовую функцию?
Я отредактировал свой ответ и поместил эту строку в вашу функцию test_status
...
вы визуализируете представление под названием
contact-validate
, а неcontact