Правильный способ заполнения и удаления данных в базе данных для тестирования Laravel? - PullRequest
0 голосов
/ 23 декабря 2018

Я новичок в тестах Laravel, и сейчас я создаю свои тесты, чтобы они использовали определенные данные в моей базе данных, чтобы проверить, выполнил ли HTTP-запрос соответствующую работу.Я пытаюсь выяснить, как я могу «заполнить» данные в своей базе данных до того, как я выполню свои тесты, но также и удалить эти данные после того, как все тесты будут завершены (либо успешный, либо неудачный, в любом случае должен быть удален).

Я пытался понять, как это сделать правильно, читая некоторые статьи в Интернете, но просто не смог найти для меня правильного решения.

Я знаю, что в файле node.js в тестах Mocha есть "beforeEach" для манипулированияданные перед каждым тестом, есть ли подобная опция в PHP Laravel?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Хотя ответ Ива должен работать (отдельная база данных), я нашел набор методов, которые могут помочь в достижении того, что мне нужно: «setUp» и «tearDown».

метод «setUp» сделает что-тодо того, как будет запущен набор тестов (класс test) и «tearDown» сделает что-то после того, как все эти тесты были выполнены.

Я прилагаю свой тестовый класс здесь для примера того, как я использовал их:

<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserTest extends TestCase
{
    private $token;

    public function setUp(){
        parent::setUp();

        $userData = [
            'email' => 'mytestemail@email.com',
            'password' => '123456'
        ];

        $response = json_decode($this->post('/register', $userData)->baseResponse->getContent());

        $this->token = $response->token;
    }
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testRegister()
    {
        $validData = [
            'email' => 'testrerere@email.com',
            'password' => '123456'
        ];

        $invalidEmail = [
            'email' => 'not_a_real_email',
            'password' => '123456'
        ];

        $invalidPassword = [
            'email' => 'test2@email.com',
            'password' => '12'
        ];

        $emptyData = [];

        $goodResponse = $this->post('/register', $validData);

        $goodResponse->assertStatus(201);
        $goodResponse->assertJsonStructure(['token']);

        User::where('email', 'testrerere@email.com')->delete();

        $invalidEmailResponse = $this->post('/register', $invalidEmail);
        $invalidEmailResponse->assertStatus(400);

        $invalidPasswordResponse = $this->post('/register', $invalidPassword);
        $invalidPasswordResponse->assertStatus(400);

        $emptyDataResponse = $this->post('/register', $emptyData);
        $emptyDataResponse->assertStatus(400);
    }

    public function testToken()
    {
        $validData = [
            'email' => 'mytestemail@email.com',
            'password' => '123456'
        ];

        $invalidData = [
            'email' => 'nonexistingemail@test.com',
            'password' => '123456'
        ];

        $validDataResponse = $this->post('/token', $validData);
        $validDataResponse->assertStatus(200);
        $validDataResponse->assertJsonStructure(['token']);

        $invalidDataResponse = $this->post('/token', $invalidData);
        $invalidDataResponse->assertStatus(400);
    }

    //get an account object based on a token
    public function testAccount()
    {
        $goodResponse = $this->withHeaders([
            'Authorization' => 'Bearer ' . $this->token,
        ])->json('GET', '/account');

        $goodResponse
            ->assertStatus(200)
            ->assertJsonStructure([
                'user',
            ]);

        //altering the token to get an invalid token error
        $badResponse = $this->withHeaders([
            'Authorization' => 'Bearer L' . $this->token,
        ])->json('GET', '/account');

//        print_r($badResponse->baseResponse->getContent());

        $badResponse->assertJson(['status' => 'Token is Invalid']);
    }

    public function tearDown()
    {
        User::where('email', 'mytestemail@email.com')->delete();
        User::where('email', 'testrerere@email.com')->delete();

        parent::tearDown();
    }
}
0 голосов
/ 23 декабря 2018

С версией laravel больше 5.5 вы можете использовать черту RefreshDatabase в вашем тесте, которая будет сбрасывать вашу базу данных после запуска теста.Все, что вам нужно сделать, это добавить его в начало вашего теста, как показано ниже:

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;

class YourModelNameTest extends TestCase
{
    use RefreshDatabase;


    public function setUp()
    {
        parent::setUp();

        // This will run all your migration
        Artisan::call('migrate');

        // This will seed your database
        Artisan::call('db:seed');

        // If you wan to seed a specific table
        Artisan::call('db:seed', ['--class' => 'TableNameSeeder ', '--database' => 'testing']);
    }

}

Черта RefreshDatabase имеет определение refreshDatabase, которое переносит базу данных до и после каждого теста.Вы можете увидеть код здесь

RefreshDatabse refreshDatabase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...