2016-06-30 96 views
11

Attualmente sto creando un pacchetto Laravel che inietta un nuovo metodo in Illuminate\Http\Request tramite Macros. Il metodo che sto iniettando è stato completato e dovrebbe funzionare bene, ma voglio anche testarlo prima di rilasciarlo.Come simulare l'intestazione Accept in un test all'interno di un pacchetto Laravel 5?

Il mio test richiede di modificare l'intestazione della richiesta Accept, in modo che possa vedere se il test sta passando o no. Così ho fatto quanto segue per simulare la richiesta:

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

Poi nel mio test Io uso il metodo che sto iniettando nel Request con $this->request->wantsYaml() ed è sempre il ritorno falsa in quanto l'intestazione Accept non è sempre impostata su 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! 
    } 
} 

Come posso continuare a simulare le intestazioni in un test nello sviluppo del pacchetto Laravel?


EDIT

Questo è il mio YamlRequest classe

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

Così ho letteralmente dovuto simulare l'accettare per vedere se il mio metodo wantsYaml funziona come previsto.

+0

Si prega di includere la classe o la parte della classe in cui si desidera eseguirla e come si passa/crea oggetto Richiesta in questa classe –

+0

Aggiunta l'istruzione 'use'. – Aborted

+0

@ MarcinNabiałek Quale classe intendi esattamente? Voglio solo simulare l'intestazione Content-Type per i miei test. Il mio codice funziona come dovrebbe (credo), ma ho bisogno di questa simulazione nei miei test per dimostrarlo. – Aborted

risposta

-1

Ok, a dire il vero non so come si utilizza questo YamlRequest nel codice, ma penso che ci sono 2 problemi qui:

1) il test si crea Illuminate\Http\Request oggetto e non YamlRequest oggetto - è è corretto? Per me non sembra, ma forse dovrebbe essere così

2) La seconda cosa è il codice del metodo. Guardando il tuo metodo di implementazione di impostare intestazione non valida perché getAcceptableContentTypes() metodo ottiene Accept intestazione e non Content-Type

Se cambio il codice di prova per qualcosa di simile:

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

passa. Ma ho dovuto usare l'intestazione Accept e non Content-Type. Penso che sia l'errore.

+0

Ci scusiamo per non aver spiegato quella parte come avrei dovuto. Io uso una macro (vedi il tratto Macroable in Laravel) e inserisco YamlRequest tramite il Service Provider del pacchetto, quindi ho il metodo 'wantsYaml()' disponibile nella classe 'Request'. Nella mia classe TestCase, ho provato a passare l'intestazione a 'Accept' nel metodo' setUp', ma non ha funzionato. Aggiornerò il mio codice qui sopra. – Aborted

+0

Ancora non funziona con la modifica btw – Aborted

+0

Inoltre, tieni presente che tutto ciò sta accadendo all'interno di un singolo pacchetto laravel senza la parte "di applicazione" reale! – Aborted