web-dev-qa-db-fra.com

Laravel test phpunit get avec paramètres

J'écris des tests pour mes contrôleurs mais l'un de mes tests ne fonctionne pas. Il est censé rechercher et récupérer les résultats sur la page. Mais il s'agit en fait d'une redirection vers la page d'accueil. Voici mon code:

use DatabaseMigrations;
protected $user;
public function setUp()
{
    parent::setUp();

    $this->seed();

    $this->user = factory(User::class)->create(['role_id' => 3]);
}

/** @test */
public function test_manage_search_user()
{
    $response = $this->followingRedirects()->actingAs($this->user)->get('/manage/users/search', [
        'choices' => 'username',
        'search' => $this->user->username,
    ]);

    $response->assertViewIs('manage.users');
    $response->assertSuccessful();
    $response->assertSee($this->user->email);
}

L'URL que vous devriez obtenir pour que cela fonctionne ressemble à ceci:

http://localhost/manage/users/search?choices=username&search=Test

J'ai vérifié à nouveau et il semble que ce ne soit pas indiqué dans le paramètres avec la requête get. Comment puis-je réparer cela?

10
MrAndre

J'ai eu le même problème en essayant de tester les requêtes GET, vous ne pouvez pas réellement passer le paramètre avec la fonction $this->get('uri', [header]) mais vous pouvez en utilisant $this->call, Si vous vous enregistrez - MakesHttpRequests.php vous pouvez voir que this->get() utilise en fait la méthode d'appel.

En ajoutant un tableau pour obtenir la méthode, vous changez les en-têtes de requête, c'est pourquoi vous n'obtenez pas vos paramètres.

public function get($uri, array $headers = [])
{
    $server = $this->transformHeadersToServerVars($headers);

    return $this->call('GET', $uri, [], [], [], $server);
}

public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
    $kernel = $this->app->make(HttpKernel::class);

    $files = array_merge($files, $this->extractFilesFromDataArray($parameters));

    $symfonyRequest = SymfonyRequest::create(
        $this->prepareUrlForRequest($uri), $method, $parameters,
        $cookies, $files, array_replace($this->serverVariables, $server), $content
    );

    $response = $kernel->handle(
        $request = Request::createFromBase($symfonyRequest)
    );

    if ($this->followRedirects) {
        $response = $this->followRedirects($response);
    }

    $kernel->terminate($request, $response);

    return $this->createTestResponse($response);
}

Donc, si vous voulez tester une GET Request, vous devrez le faire:

$request = $this->call('GET', '/myController', ["test"=>"test"]);

Dans votre contrôleur, vous devriez pouvoir obtenir ces paramètres comme ceci:

public function myController(Request $request)
{
    $requestContent = $request->all();
    $parameter = $requestContent['test'];
}
10
MathieuAuclair

J'utilise Laravel 5.X (plus précisément 5.6), vous pouvez passer des paramètres personnalisés en utilisant:

 $response = $this->json('GET',  '/url/endpoint',['params'=>'value']);
6
Hyder B.

Vous pouvez utiliser l'assistant d'itinéraire pour créer une URL avec une chaîne de requête. dans votre cas, je ferais quelque chose comme ça. En supposant que le nom de l'itinéraire est manage.users.search

$route = route('manage.users.search', [
    'choices'=> 'username',
    'search' => $this->user->username,
]);

$response = $this->followingRedirects()
    ->actingAs($this->user)
    ->get($route);
0
shxfee