Symfony 4:JWT 和 Behat 的测试数据库 [英] Symfony 4: Test DB for JWT and Behat

查看:26
本文介绍了Symfony 4:JWT 和 Behat 的测试数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Symfony 4 中使用 API Platform 2.1,我使用 LexikJWTAuthenticationBundle 进行身份验证,并使用 Behat 进行测试.

I am using API Platform 2.1 with Symfony 4 and I am using the LexikJWTAuthenticationBundle for authentication, and Behat for testing.

我无法正确设置.这是我目前的配置:

I am unable to set things up properly. Here is my configuration so far:

Feature: Books feature

@createSchema @dropSchema
Scenario: Adding a new book
  When I add "Content-Type" header equal to "application/json"
  And I add "Accept" header equal to "application/json"
  And I send a "POST" request to "/api/books" with body:
  """
 {
    "title": "King",
    "author": "T. M. Frazier",
    "enabled": true
 }
 """
 Then the response status code should be 201
 And the response should be in JSON
 And the header "Content-Type" should be equal to "application/json"
 And the JSON nodes should contain:
    | title                   | King              |
    | author                  | T. M. Frazier     |
 And the JSON node "enabled" should be true

这是我的功能上下文:

<?php

use Behat\Behat\Context\Context;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use App\Entity\User;
use Behatch\Context\RestContext;
use Behat\Behat\Context\SnippetAcceptingContext;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\Tools\SchemaTool;


/**
 * This context class contains the definitions of the steps used by the demo 
 * feature file. Learn how to get started with Behat and BDD on Behat's website.
 * 
 * @see http://behat.org/en/latest/quick_start.html
 */
class FeatureContext implements Context, SnippetAcceptingContext
{
    /**
     * @var KernelInterface
     */
    private $kernel;

    private $manager;

    private $jwtManager;

    private $schemaTool;

    private $response;

    private $classes;

    private $restContext;

    public function __construct(KernelInterface $kernel,$manager,$jwtManager)
    {
        $this->kernel = $kernel;
        $this->manager = $manager->getManager();
        $this->jwtManager = $jwtManager;
        $this->schemaTool = new SchemaTool($this->manager);
        $this->classes = $this->manager->getMetadataFactory()->getAllMetadata();
    }

    /**
     * @When a demo scenario sends a request to :path
     */
    public function aDemoScenarioSendsARequestTo(string $path)
    {
        $this->response = $this->kernel->handle(Request::create($path, 'GET'));
    }

    /**
     * @Then the response should be received
     */
    public function theResponseShouldBeReceived()
    {
        if ($this->response === null) {
            throw new \RuntimeException('No response received');
        }
    }

    /**
     * @BeforeScenario @createSchema
     */
    public function createDatabase()
    {
        $this->schemaTool->createSchema($this->classes);
    }

    /**
     * @AfterScenario @dropSchema
     */
    public function dropDatabase()
    {
        $this->schemaTool->dropSchema($this->classes);
    }

    /**
     * @BeforeScenario
     * @login
     *
     * @see https://symfony.com/doc/current/security/entity_provider.html#creating-your-first-user
     */
    public function login(BeforeScenarioScope $scope)
    {
        $user = new User();
        $user->setUsername('admin');
        $user->setPassword('ATestPassword');
        $user->setEmail('test@test.com');

        $this->manager->persist($user);
        $this->manager->flush();

        $token = $this->jwtManager->create($user);

        $this->restContext = $scope->getEnvironment()->getContext(RestContext::class);
        $this->restContext->iAddHeaderEqualTo('Authorization', "Bearer $token");
    }

    /**
     * @AfterScenario
     * @logout
     */
    public function logout() {
        $this->restContext->iAddHeaderEqualTo('Authorization', '');
    }
}

现在在执行 vendor/bin/behat 时,它只是读取 .env 文件(开发环境)并尝试将管理员添加到我的开发数据库中.

Now when executing vendor/bin/behat, it simply reads the .env file (dev environment) and tries to add an admin to my development database.

1) 我如何确保创建了测试数据库并且不使用开发数据库进行测试?我试过用不同的配置创建一个 .env.test ,但这没有用.

1) How do I ensure that a test db is created and the dev db is not used for testing? I have tried creating a .env.test with a different config but that didn't work.

2) 即使没有在场景上方的 @login 注释,它也会从 FeatureContext 到达 login 方法.应该是这样吗?

2) even without the @login annotation above the scenario it reaches the login method from the FeatureContext. Is that how it is supposed to be?

3) 我在任何地方都找不到有关如何设置的适当文档.API 平台文档似乎也不是很有帮助.参考:https://api-platform.com/docs/core/jwt/#jwt-身份验证他们谈论了 createDBdropDB,但它甚至不存在于任何地方.所以我从另一个网站上拿了它.这是正确的做法吗?

3) I can't find proper documentation anywhere of how to set this up. The API Platform docs don't seem to be very helpful either. Reference: https://api-platform.com/docs/core/jwt/#jwt-authentication They talk about a createDB and dropDB, but it doesn't even exist anywhere. So I took it from another website. Is this the right way to do it?

推荐答案

我对 1) 和 3) 没有答案,但是对于 2)

I have no answer for 1) and 3), but for 2)

    /**
     * @BeforeScenario
     * @login
     */

应该在一行上,像这样:

should be on a single line, like so:

    /**
     * @BeforeScenario @login
     */

这篇关于Symfony 4:JWT 和 Behat 的测试数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆