Имитировать HTTP_REFERER в тесте Laravel Dusk? - PullRequest
4 голосов
/ 11 марта 2019

Есть ли простой способ имитировать HTTP_REFERER в сумерках?Я использую Laravel\Dusk\Browser и вызываю метод visit() на разных страницах.Это использует драйвер Selenium.


Что-то вроде setReferer ниже:

namespace Example\Tests\Browser\Processes\PublicSite;

class SampleBrowser extends Browser {
    use MakesAssertions, ProvidesAdditionalBrowserActions, WaitsForElements;
    public function __construct(RemoteWebDriver $driver, $resolver = null)
    {
        parent::__construct($driver, new ElementResolver($driver,
                            $resolver->prefix ?? 'body'));
    }
}


class SampleTestCase extends BrowserTestCase
{
    /**
     * Test that the deal builder modal shows up.
     */
    public function testRefererRendering()
    {
        $this->browse(function (SampleBrowser $browser) {
            $browser
                // this is the bit that I want
                ->setReferer('https://example.org/') 
                ->visit('/')
                ->waitForLocation('/?came_via=example.org')
                ->assertCookieValue('came_via', 'example.org');
        });
    }
}

1 Ответ

4 голосов
/ 28 марта 2019

Dusk или любое другое решение для тестирования Browser / Selenium не реализует такую ​​функцию, и, похоже, они никогда этого не сделают.

См. https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2047

Опция 1

Перейдите к URL-адресу реферера, затем введите сценарий, который заставляет страницу перейти к тому, который вы хотите проверить.

Опция 2

Используйте прокси-сервер, который перехватывает запросы иустанавливает для реферера тот, который вам нужен

https://github.com/j-bennet/selenium-referer

Опция 3

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

Например:

<?php

namespace App\Http\Controllers;

use \Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class HomeController extends Controller
{
    public function home(Request $request)
    {
        $referer = $request->header('Referer');
        if ($referer) {
            return redirect()->route('home', ['came_via' => $referer]);
        }
        return view('welcome');
    }
}

и TestCase

<?php

namespace Tests\Feature;

use Tests\TestCase;

class RedirectTest extends TestCase
{
    /**
     * A basic redirect example.
     *
     * @return void
     */
    public function testRedirection()
    {
        // Normal request
        $response = $this->get('/');
        $response->assertStatus(200);

        // Referer check redirection
        $referer = 'http://google.com';
        $response = $this->call('GET', '/', [], [], [], ['HTTP_REFERER' => $referer]);
        $response->assertRedirect('/?came_via=' . urlencode($referer));
    }
}

Результат

OK (2 tests, 4 assertions)
...