web-dev-qa-db-ja.com

Laravel phpunitテストはパラメーターで取得します

コントローラーのテストをいくつか書いていますが、テストの1つが機能しません。検索と結果をページに戻すが必要です。しかし、実際にはホームページにリダイレクトしています。これが私のコードです:

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

これを機能させるために取得する必要があるURLは、次のようになります。

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

もう一度確認したところ、getリクエストのパラメータに指定されていないようです。どうすれば修正できますか?

12
MrAndre

GETリクエストをテストしようとして同じ問題が発生しました。実際には$this->get('uri', [header])でパラメーターを渡すことはできませんが、チェックインする場合は_$this->call_を使用してできますMakesHttpRequests.phpthis->get()が実際に呼び出しメソッドを使用していることがわかります。

Getメソッドに配列を追加すると、リクエストヘッダーが変更されます。これが、パラメーターを取得しない理由です。

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

したがって、GETリクエストをテストする場合は、次のようにする必要があります。

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

あなたのコントローラーでは、これらのパラメーターを次のように取得できるはずです:

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

私はLaravel 5.X(より正確には5.6)を使用していますが、次を使用してカスタムパラメータを渡すことができます。

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

リクエストヘルパーを使用して、http getパラメータを次のようにマージできます。

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

ルートヘルパーを使用して、クエリ文字列でURLを作成できます。あなたの場合、私はこのようなことをします。ルート名がmanage.users.searchであると仮定します

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

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