Как смоделировать метод запроса в phpunit? - PullRequest
0 голосов
/ 16 марта 2019

Я начал использовать издевательство, поэтому у меня возникла проблема с выполнением моего модульного теста.Я хочу протестировать промежуточное программное обеспечение для проверки подлинности, я прошел одно условие для expectsJson, поэтому мне нужен еще один шаблон для возврата true из expectesJson, как показано ниже, но не успеха

Authenticate.php

protected function redirectTo($request)
{
    if (! $request->expectsJson()) {
        return route('login');
    }
}

AuthenticatTest.php

class AuthenticateTest extends TestCase
{
    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function testMiddleware()
    {
      $request = Request::create(config('app.url') . '500', 'GET',[],[],[],['REMOTE_ADDR'=>'127.0.0.1:8000']);
      $middleware = new Authenticate($this->createMock(Factory::class));
      $class = new \ReflectionClass(Authenticate::class);
      $method = $class->getMethod("redirectTo");
      $method->setAccessible(true);
      $expectedStatusCode = 401;
      $this->assertContains("http://",$method->invokeArgs($middleware,[$request]));
    }

    public function testMiddlewareElse()
    {
      $this->mock(Request::class, function($mock) {
        $mock->shouldReceive("expectsJson")
          ->once()->andReturn(true);
      });

      $request = Request::create(config('app.url') . '200', 'POST',[],[],[],['REMOTE_ADDR'=>'127.0.0.1:00']);
      $middleware = new Authenticate($this->createMock(Factory::class));
      $class = new \ReflectionClass(Authenticate::class);
      $method = $class->getMethod("redirectTo");
      $method->setAccessible(true);
      $this->assertContains("",$method->invokeArgs($middleware,[$request]));
    }
}

testMiddlewareElse не пройден, Как вернуть true для $request->expectsJson

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вот как вы можете протестировать запрос на промежуточное ПО аутентификации. Предположим, что у вас есть маршрут, требующий проверки подлинности и управляемый UserController@dashboard (или аналогичным):

public function testMiddleware() {
      // You could disable the other middleware of the route if you don't want them to run e.g.
      // $this->withoutMiddleware([ list of middleware to disable ]);
      $mockController = $this->prophecy(UserController::class);
      //This is if the middleware passes and the controller method is called, use shouldNotBeCalled if you expect it to fail 
      $mockController->dashboard(Prophecy::any())->shouldBeCalled();
      $this->app->instance(
         UserController::class, 
         $mockController->reveal()
      );
      $this->json("GET", url()->action("UserController@dashboard"));
}
0 голосов
/ 16 марта 2019

Я нашел решение!Мне нужно передать фиктивный класс в параметрах invoke ...;)

public function testMiddlewareElse()
{
  $mock = $this->mock(Request::class, function($mock) {
    $mock->shouldReceive("expectsJson")
      ->once()->andReturn(true);
  });

  $request = Request::create(config('app.url') . '200', 'POST',[],[],[],['REMOTE_ADDR'=>'127.0.0.1:00']);
  $middleware = new Authenticate($this->createMock(Factory::class));
  $class = new \ReflectionClass(Authenticate::class);
  $method = $class->getMethod("redirectTo");
  $method->setAccessible(true);
  $this->assertContains("",$method->invokeArgs($middleware,[$mock]));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...