phpunit: How do I pass values between tests?

前端 未结 4 527
礼貌的吻别
礼貌的吻别 2021-01-03 19:48

I\'m really running into a brick wall with this. How do you pass class values between tests in phpunit?

Test 1 -> sets value,

Test 2 -> reads value

H

4条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-03 20:19

    Another option is to use static variables.

    Here is an example (for Symfony 4 functional tests):

    namespace App\Tests\Controller\Api;
    
    use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait;
    use Symfony\Component\HttpFoundation\AcceptHeader;
    
    class BasicApiTest extends WebTestCase
    {
        // This trait provided by HautelookAliceBundle will take care of refreshing the database content to a known state before each test
        use RefreshDatabaseTrait;
    
        private $client = null;
    
        /**
         * @var string
         */
        private const APP_TOKEN = 'token-for-tests';
    
        /**
         * @var string
         */
        private static $app_user__email = 'tester+api+01@localhost';
    
        /**
         * @var string
         */
        private static $app_user__pass = 'tester+app+01+password';
    
        /**
         * @var null|string
         */
        private static $app_user__access_token = null;
    
        public function test__Authentication__Login()
        {
            $this->client->request(
                Request::METHOD_POST,
                '/api/login',
                [],
                [],
                [
                    'CONTENT_TYPE' => 'application/json',
                    'HTTP_App-Token' => self::APP_TOKEN
                ],
                '{"user":"'.static::$app_user__email.'","pass":"'.static::$app_user__pass.'"}'
            );
            $response = $this->client->getResponse();
    
            $this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
    
            $content_type = AcceptHeader::fromString($response->headers->get('Content-Type'));
            $this->assertTrue($content_type->has('application/json'));
    
            $responseData = json_decode($response->getContent(), true);
            $this->assertArrayHasKey('token', $responseData);
    
            $this->static = static::$app_user__access_token = $responseData['token'];
        }
    
        /**
         * @depends test__Authentication__Login
         */
        public function test__SomeOtherTest()
        {
            $this->client->request(
                Request::METHOD_GET,
                '/api/some_endpoint',
                [],
                [],
                [
                    'CONTENT_TYPE' => 'application/json',
                    'HTTP_App-Token' => self::APP_TOKEN,
                    'HTTP_Authorization' => 'Bearer ' . static::$app_user__access_token
                ],
                '{"user":"'.static::$app_user__email.'","pass":"'.static::$app_user__pass.'"}'
            );
            $response = $this->client->getResponse();
    
            $this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
    
            $content_type = AcceptHeader::fromString($response->headers->get('Content-Type'));
            $this->assertTrue($content_type->has('application/json'));
            //...
        }
    }
    

提交回复
热议问题