Laravel 9 TestCase «Ответ не является представлением»

Я новичок в 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);

Что я пропустил? Вам нужно больше кода, чтобы ответить?

вы визуализируете представление под названием contact-validate, а не contact

Joseph 17.03.2022 12:40

Нет, я отображаю контактную проверку только в том случае, если сообщение формы в порядке. Я проверяю два случая: если все в порядке, а если нет. И в двух случаях у меня есть ответ на сообщение, это не представление...

Chenille33 17.03.2022 13:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете отключить обработку исключений, чтобы увидеть результат.

   /**
     * Test page HTTP status
     *
     * @return void
     */
    public function test_status()
    {
        $this->withoutExceptionHandling();
        $response = $this->get('/contact');
        $response->assertStatus(200);
    }

Может будет полезно Модульный тест Laravel (ответ не является представлением)

Я уже видел этот пост, но не понимаю цели: почему исключение hiddind правильное и изменить проверку? Кроме того, у меня есть другая проблема (требуется): электронная почта должна быть действительным адресом электронной почты. (и еще 1 ошибка) Конечно, это плохое электронное письмо, но как я могу это проверить?

Chenille33 17.03.2022 13:52

Просто чтобы быть уверенным: я поместил эту строку в функцию setUp() или в свою тестовую функцию?

Chenille33 17.03.2022 14:35

Я отредактировал свой ответ и поместил эту строку в вашу функцию test_status...

Josh Alecyan 17.03.2022 14:54

Другие вопросы по теме