Laravel phpunit testing get with parameters

2022-08-30 16:29:12

我正在为我的控制器编写一些测试,但我的一个测试不起作用。它支持搜索并将结果返回到页面。但它实际上重定向到主页。这是我的代码:

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请求。我该如何解决这个问题?


答案 1

我在尝试测试请求时遇到了同样的问题,您实际上无法使用传递参数,但您可以使用,如果您签入MakesHttpRequests.php您可以看到它实际上是在使用调用方法。GET$this->get('uri', [header])$this->callthis->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'];
}

答案 2

我使用的是Laravel 5.X(更确切地说是5.6),您可以使用以下命令传递自定义参数:

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

推荐