用模拟[Symfony 4 API]进行单元测试

时间:2019-10-15 09:20:49

标签: php api symfony mocking phpunit-testing

我想使用MOCK(在API symfony 4中)使用PHP单元测试控制器的功能,但是我找不到方法。 实际上,我已经进行了一些研究,并且找不到任何方法,我安装了PHP单元并编写了一个没有模拟的测试Web案例,这是可行的,但不是模拟的。我想使用模拟,因为我不想接触数据库。 任何人都可以帮助我实现这一目标。

这是我的控制者:

<?php

   namespace App\Controller;


   use App\Utils\MatchServiceInterface;
   use App\Utils\ModeServiceInterface;
   use App\Utils\PlayerServiceInterface;
   use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
   use Symfony\Component\HttpFoundation\JsonResponse;
   use Symfony\Component\HttpFoundation\Request;
   use Symfony\Component\Routing\Annotation\Route;


   /**
   * @Route("/api/scouters/matchs")
   * Manage entity Match
   * Class MatchController
   * @package App\Controller
   */
   class MatchController extends AbstractController
   {

private $playerService;
private $modeService;
private $matchService;

/**
 * ScouterController constructor.
 * @param PlayerServiceInterface $playerService
 * @param ModeServiceInterface $modeService
 * @param MatchServiceInterface $matchService
 */
public function __construct(PlayerServiceInterface  $playerService, ModeServiceInterface $modeService, MatchServiceInterface $matchService)
{
    $this->playerService = $playerService;
    $this->modeService = $modeService;
    $this->matchService = $matchService;
}

/**
 * @Route("/create", name="create_match", methods={"POST"})
 * @param Request $request
 * @return JsonResponse
 */
public function createMatch(Request $request): JsonResponse
{
    $content = json_decode($request->getContent(), true);
    $message = $this->playerService->assignPlayerToMatch($content);
    return new JsonResponse($message, JsonResponse::HTTP_OK);
}

/**
 * @Route("/mode", name="mode_match", methods={"POST"})
 * @param Request $request
 * @return JsonResponse
 * @return JsonResponse
 */
public function modeMatch(Request $request): JsonResponse
{
    $content = json_decode($request->getContent(), true);
    $message = $this->modeService->assignModeToMatch($content);
    return new JsonResponse($message, JsonResponse::HTTP_OK);
}

/**
 * @Route("/features", name="feat_mode_match", methods={"POST"})
 * @param Request $request
 * @return JsonResponse
 */
public function featMode(Request $request): JsonResponse
{
    $content = json_decode($request->getContent(), true);
    $this->matchService->modeFeature($content);
    $message = $this->matchService->modeFeature($content);
    return new JsonResponse($message, JsonResponse::HTTP_OK);
}

}

这是测试我的登录功能的示例,

   /**
 * test ScouterController:login
 */
public function testLogin()
{
    $data = ['email' => 'meher.jaber@solixy.com', 'password' => 'FootStat@2019'];
    $client = static::createClient();
    $request = $client->request('POST', '/api/scouter/login', [], [], [], json_encode($data));
    $response = $client->getResponse();
    $this->assertSame('"EmailPasswordValidAndHasNotPlayer"', $response->getContent());
    $this->assertSame(200, $response->getStatusCode());

}

登录功能:

/**
 * Login Scouter
 * @Route("/login", name="login_scouter", methods={"POST"})
 * @param Request $request
 * @return JsonResponse
 */
public function login(Request $request): JsonResponse
{
    $content = json_decode($request->getContent(), true);
    $message = $this->securityService->loginScouter($content);
    $this->securityService->loginScouter($content);
    return new JsonResponse($message, JsonResponse::HTTP_OK);
}

登录服务:

 /**
 * @param $content
 * @return array|string
 */
public function loginScouter($content)
{
    $scouter = $this->em->getRepository(Scouter::class)->findOneBy(['email' => $content['email']]);
    if ($scouter) {
        /* @var $scouter Scouter */
        if ($this->encoder->isPasswordValid($scouter, $content['password'])) {
            if (is_null($scouter->getPlayer())) {
                $message = "EmailPasswordValidHasNotPlayer";
            } else {
                /* @var $player Player */
                $player = $scouter->getPlayer();
                /* @var $lastMatch Match */
                $lastMatch = $this->em->getRepository(Match::class)->findLastInserted($player->getId());
                $message = ['idPlayer' => $player->getId(), 'firstName' => $player->getFirstName(), 'lastName' => $player->getFamilyName(), 'team' => $lastMatch->getTeam(), 'oppTeam' => $lastMatch->getOppositeTeam()];
            }
        } else {
            $message = "PasswordInvalid";
        }
    } else {
        $message = "EmailInvalid";
    }
    return $message;
}

0 个答案:

没有答案