Nano Hash - криптовалюты, майнинг, программирование

получить запрос в тесте Laravel phpunit ищет другой URL-адрес

Я пытаюсь создать простой тест phpunit для модели Note в моем приложении Laravel. Я просто хочу проверить, что запрос на получение определенного экземпляра заметки будет отображать некоторые свойства этой заметки.

У меня есть модель 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) Tests\Feature\NotesTest::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/ удаляется из запроса на получение.

У меня есть другие тесты для индекса и хранилища, которые работают нормально. Только этот показывает такое поведение.


  • Вы можете закомментировать все остальные маршруты в приложении и посмотреть, пройдет ли тест? Может быть, у вас есть перенаправление в какой-то другой маршрут? 07.02.2019
  • Спасибо - только что попробовал - закомментировал все маршруты, кроме того, который показан в моем вопросе. Но проблема сохраняется. Я просмотрю код и удостоверюсь, что нигде больше нет перенаправлений, кроме маршрутов. 07.02.2019
  • Я не мог найти никакого перенаправления в коде. Итак, я решил просто обойти тест и убедиться, что модель/контроллер/маршруты действительно работают. Конечно же, они делают. Кажется, что только сам тест каким-то образом удаляет /notes/ из запроса на получение и выдает ошибку. Может быть, есть что-то в тестах PHPUnit, что вызывает это, о чем я блаженно не знаю? 07.02.2019
  • Использование именованного маршрута также работает... 07.02.2019
  • Когда вы закомментируете все остальные маршруты и запустите php artisan route:list, вы увидите только этот /notes/{note} маршрут? 07.02.2019
  • @Amade - Большинство маршрутов исчезают, но не все. Есть еще маршруты для пользовательской модели. Также есть маршруты для некоторых других провайдеров (Telescope, который сейчас отключен, а также debugbar). Также есть еще пара маршрутов ресурсов, где URI имеет префикс api/, которые все еще остаются. 08.02.2019
  • забыл спросить об этом раньше - работает ли он должным образом, когда вы открываете URL-адрес прямо в браузере? 08.02.2019
  • @Amade Да, это так. В принципе все работает, кроме самого теста. И с тех пор я обнаружил, что если я использую именованный маршрут, даже тест работает. Как только я указываю маршрут, как показано выше ($this->get('/notes/' . $note->id); или $this->get('/notes/1');), /notes/ удаляется из запроса. 08.02.2019
  • Что вы получаете, когда dd() именованный маршрут? 08.02.2019
  • Вот маршрут под названием «shownote»: Route::get('/notes/{note}', 'NotesController@show')->name('shownote'); dd(route('shownote', $note->id)); дает http://shepherding.test/notes/1. dd('/notes/' . $note->id); дает /notes/1. И dd($note->path()); дает /notes/1. Извините за форматирование, я не могу получить двойной пробел после строки, чтобы создать новую строку. 08.02.2019
  • хорошо, теперь мы знаем, что когда вы передаете полный путь к $this->get(), тест работает. Я думаю, вы сможете найти решение здесь: stackoverflow.com/q/22967227/4171578 08.02.2019
  • Вот оно. Спасибо. Для справки, этот поток заполняет некоторую другую информацию, которой у меня не было, о том, как внести изменения в файл TestCase.php: stackoverflow.com/questions/45381501/. Если у кого-то есть ответ, мне было бы любопытно узнать, почему тесты не используют автоматически APP_URL из файла .env? 08.02.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..