Laravel phpunit testing get with parameters

Viewed 28554

I am writing some tests for my controllers but one of my tests doesn't work. It's supossed to search and get the results back to the page. But it's actually redirecting to the home page. Here is my 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);
}

The URL you should get to make it work look like this:

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

I checked again and it looks like it's not given in the parameters with the get request. How can I fix this?

8 Answers

I'm using Laravel 5.X (more precisely 5.6), you can pass custom parameters using:

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

You can use the route helper to build a url with query string. in your case i would do something like this. Assuming the route name is manage.users.search

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

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

In order to send parameters with GET requests.

  1. If you use the route() method then you can pass the data as the second parameter.

    $response = $this->get(route('route_name', ['key' => value]));

  2. If you using URL directly, you could use like this

    $response = $this->get('url?' . Arr::query(['key' => value]));

Do whatever you want to do with $response.

You could use the request helper to merge in http get parameters as such:

    /** @var \Illuminate\Http\Request $request */
    $request = request();
    $request->merge([
        'choices' => 'username',
        'search' => 'Test'
    ]);

This worked for me simply pass the parameter as part of the url as follows:


$response = $this->get('api/endpoint?parameter1='.$this->dynamicParam);

Add a helper function:

if (!function_exists('extend_url_with_query_data')) {
    function extend_url_with_query_data(string $url, array $queryData): string
    {
        if ($queryData == []) {
            return $url;
        }

        $glue = mb_strpos($url, '?') === false ? '?' : '&';

        $queryString = http_build_query($queryData);

        return "{$url}{$glue}{$queryString}";
    }
}

Usage:

$queryData = [
    'works' => true,
];

$this->get(
    extend_url_with_query_data('/api/v1/example', $queryData)
);

I would do it like this:

$this->actingAs($this->user);

$response = $this->get('/manage/users/search', [
    'choices' => 'username',
    'search' => $this->user->username,
]);

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