2016-06-30 10 views
11

Ich baue gerade ein Laravel-Paket, das eine neue Methode in Illuminate\Http\Request über Macros injiziert. Die Methode, die ich injiziere, wurde abgeschlossen und es wird erwartet, dass sie gut funktioniert, aber ich möchte sie auch testen, bevor sie veröffentlicht wird.Wie simuliere ich Accept-Header in einem Test in einem Laravel 5-Paket?

Mein Test erfordert, dass ich die Accept Kopfzeile der Anfrage ändere, damit ich sehe, ob der Test bestanden wird oder nicht. So habe ich folgendes getan, um die Anfrage zu simulieren:

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

Da ist in meinem Test habe ich die Methode verwenden ich in Request mit $this->request->wantsYaml() injizieren und es ist immer falsch zurückkehrt, da der Accept Header nicht auf application/x-yaml gesetzt zu werden.

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! 
    } 
} 

Wie kann ich die Header in einem Test in Laravel-Paketentwicklung simulieren?


EDIT

Das ist meine YamlRequest Klasse

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

Also das, um, wenn meine wantsYaml Methode arbeiten, um zu sehen Accept Ich muß buchstäblich simulieren, wie erwartet.

+0

Bitte fügen Sie Ihre Klasse oder den Teil der Klasse, wo Sie es tun möchten und wie Sie übergeben/erstellen Anfrageobjekt in dieser Klasse –

+0

Hinzugefügt die 'Use' Aussage. – Aborted

+0

@ MarcinNabiałek Welche Klasse meinst du genau? Ich möchte nur den Content-Type-Header für meine Tests simulieren. Mein Code funktioniert so wie es sollte (ich glaube), aber ich brauche diese Simulation in meinen Tests, um es zu beweisen. – Aborted

Antwort

-1

Ok, um ehrlich zu sein, ich weiß nicht, wie Sie diese verwenden YamlRequest in Ihrem Code, aber ich denke, es gibt zwei Probleme hier:

1) In Ihrem Test, den Sie erstellen Illuminate\Http\Request Objekt und nicht YamlRequest Objekt - ist richtig? Für mich scheint es nicht, aber vielleicht sollte es so sein

2) Zweite Sache ist der Code der Methode. Ein Blick auf Ihre Methode Implementierung Sie ungültige Header gesetzt, weil getAcceptableContentTypes() Methode Accept Header bekommt und nicht Content-Type

Wenn ich Code von Test zu so etwas wie dies zu ändern:

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

es geht. Aber ich musste Accept Header verwenden und nicht Content-Type. Ich denke, das ist der Fehler.

+0

Entschuldigung, dass ich diesen Teil nicht so erklärt habe, wie ich es hätte tun sollen. Ich benutze ein Makro (siehe Macroable Eigenschaft in Laravel) und ich injiziere die YamlRequest über den Service Provider des Pakets, daher habe ich die 'wishesYaml()' Methode in der 'Request' Klasse verfügbar. In meiner TestCase-Klasse habe ich versucht, den Header auf 'Accept' in der' setUp'-Methode zu wechseln, aber es hat nicht funktioniert. Ich aktualisiere meinen Code oben. – Aborted

+0

Es funktioniert immer noch nicht mit der Änderung btw – Aborted

+0

Beachten Sie bitte auch, dass all dies in einem einzigen Laravel-Paket passiert, ohne die eigentliche "Anwendung" Teil! – Aborted