Подтвердить что ты не робот

Как имитировать заголовок Accept в тесте в пакете Laravel 5?

В настоящее время я создаю пакет Laravel, который вводит новый метод в Illuminate\Http\Request через Макрос. Метод, который я вводил, был завершен и, как ожидается, будет работать хорошо, но я также хочу проверить его, прежде чем выпускать его.

Мой тест требует от меня изменить заголовок запроса Accept, чтобы я мог проверить, проходит ли тест или нет. Поэтому для моделирования запроса я сделал следующее:

// package/tests/TestCase.php

namespace Vendor\Package;

use Illuminate\Http\Request;
use Orchestra\Testbench\TestCase as Orchestra;

abstract class TestCase extends Orchestra
{
    /**
     * Holds the request
     * @var Illuminate\Http\Request
     */
    protected $request;

    /**
     * Setup the test
     */
    public function setUp()
    {
        parent::setUp();

        $this->request = Request::capture();

        $this->request->headers->set('Accept', 'application/x-yaml');
    }
}

Затем в моем тесте я использую метод, который я вставляю в Request с помощью $this->request->wantsYaml(), и он всегда возвращает false, так как заголовок Accept не получает значение application/x-yaml.

class RequestTest extends TestCase
{
    /** @test */
    public function it_should_return_a_bool_if_page_wants_yaml_or_not()
    {
        dump($this->request->wantsYaml()); // Return false

        $this->assertTrue($this->request->wantsYaml()); // It fails!
    }
}

Как я могу моделировать заголовки в тесте в разработке пакета Laravel?


ИЗМЕНИТЬ

Это мой класс YamlRequest

use Illuminate\Http\Request;
use Illuminate\Support\Str;

class YamlRequest extends Request
{
    /**
     * Acceptable content type for YAML.
     * @var array
     */
    protected $contentTypeData = ['/x-yaml', '+x-yaml'];

    /**
     * Determine if the current request is asking for YAML in return.
     *
     * @return bool
     */
    public function wantsYaml()
    {
        $acceptable = $this->getAcceptableContentTypes();

        // If I dd($acceptable), it comes out as empty during tests!

        return isset($acceptable[0]) && Str::contains($acceptable[0], $this->contentTypeData);
    }
}

Поэтому мне буквально приходится моделировать Accept, чтобы увидеть, работает ли мой метод wantsYaml, как ожидалось.

4b9b3361

Ответ 1

Хорошо, честно говоря, я не знаю, как вы используете этот YamlRequest в своем коде, но я думаю, что здесь есть две проблемы:

1) В вашем тесте вы создаете объект Illuminate\Http\Request, а не объект YamlRequest - это правильно? Для меня это не так, но возможно, должно быть так.

2) Во-вторых, это код метода. Глядя на реализацию вашего метода, вы устанавливаете недопустимый заголовок, потому что метод getAcceptableContentTypes() получает заголовок Accept, а не Content-Type

Если я сменю код теста на что-то вроде этого:

$request = new \App\Http\Requests\YamlRequest();
$request->headers->set('Accept', 'application/x-yaml');
$this->assertTrue($request->wantsYaml()); 

он проходит. Но мне пришлось использовать заголовок Accept, а не Content-Type. Я думаю, что ошибка.