简体   繁体   中英

Laravel phpunit testing get with parameters

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?

I had the same issue trying to test GET Requests, you actually can't pass parameter with the $this->get('uri', [header]) but you can by using $this->call , if you check in MakesHttpRequests.php you can see that this->get() is actually using call method.

By adding an array to get method, you are changing the request headers, this is why you are not getting your parameters.

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

So if you want to test a GET Request you will have to do this:

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

In your controller you should be able to get theses parameters like so:

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

我正在使用 Laravel 5.X(更准确地说是 5.6),您可以使用以下方法传递自定义参数:

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

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'
    ]);

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 .

这对我有用,只需将参数作为 url 的一部分传递,如下所示:


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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM