php testing laravel-5 phpunit package

php - ¿Cómo simular el encabezado Aceptar en una prueba dentro de un paquete Laravel 5?



testing laravel-5 (1)

Actualmente estoy creando un paquete Laravel que inyecta un nuevo método en Illuminate/Http/Request través de Macros . El método que estoy inyectando se ha completado y se espera que funcione bien, pero también quiero probarlo antes de lanzarlo.

Mi prueba requiere que cambie el encabezado Accept la solicitud, para que pueda ver si la prueba está pasando o no. Así que he hecho lo siguiente para simular la solicitud:

// 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''); } }

Luego, en mi prueba, uso el método que estoy inyectando en Request con $this->request->wantsYaml() y siempre devuelve falso ya que el encabezado Accept no se configura en 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! } }

¿Cómo puedo seguir simulando los encabezados en una prueba en el desarrollo de paquetes Laravel?

EDITAR

Esta es mi clase 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); } }

Así que, literalmente, tengo que simular la wantsYaml para ver si mi método wantsYaml funciona como se esperaba.


Ok, para ser honesto, no sé cómo usas este YamlRequest en tu código, pero creo que hay 2 problemas aquí:

1) En su prueba, crea el objeto Illuminate/Http/Request y no el objeto YamlRequest . ¿Es correcto? Para mí no lo parece pero tal vez debería ser así.

2) Lo segundo es el código del método. Al getAcceptableContentTypes() implementación de su método, establece un encabezado no válido porque el método getAcceptableContentTypes() obtiene el encabezado Accept y no el tipo de Content-Type

Si cambio el código de prueba a algo como esto:

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

pasó. Pero tuve que usar el encabezado Accept y no el tipo de Content-Type . Creo que ese es el error.