Зависимости между модульными тестами PHP в Laravel 5.7 - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю над Laravel 5.7, и я хотел бы задать вам вопрос относительно тестирования PHPUnit.

У меня есть тестовый класс, скажем, ProductControllerTest.php, с двумя методами testProductSoftDelete() иtestProductPermanentlyDelete().Я хочу использовать аннотацию @depends в testProductPermanentlyDelete () для того, чтобы сначала мягко удалить продукт, а затем получить идентификатор продукта и перейти к тесту на постоянное удаление.Проблема в том, что черта DatabaseTransaction запускает транзакции при каждом выполнении теста (метода).Мне нужно начать транзакцию перед всеми тестами моего класса ProductControllerTest, а затем откатить транзакцию в конце всех тестов.Есть ли у вас какие-либо идеи?Из того, что я искал в Интернете, ничего не работало должным образом.

public function testProductSoftDelete()
{
   some code

   return $product_id;
}

/**
* @depends testProductSoftDelete
*/
public function testProductPermanentlyDelete($product_id)
{
   code to test permanently deletion of the product with id $product_id.
   There is a business logic behind that needs to soft delete first a 
   product before you permanently delete it.

}

Имеет ли смысл следующее:

    namespace Tests\App\Controllers\Product;

    use Tests\DatabaseTestCase;
    use Tests\TestRequestsTrait;

    /**
     * @group Coverage
     * @group App.Controllers
     * @group App.Controllers.Product
     *
     * Class ProductControllerTest
     *
     * @package Tests\App\Controllers\Product
     */

    class ProductControllerTest extends DatabaseTestCase
    {
        use TestRequestsTrait;

        public function testSoftDelete()
        {
            $response = $this->doProductSoftDelete('9171448');
            $response
                ->assertStatus(200)
                ->assertSeeText('Product sof-deleted successfully');
        }


        public function testUnlink()
        {
            $this->doProductSoftDelete('9171448');
            $response = $this->actingAsSuperAdmin()->delete('/pages/admin/management/product/unlink/9171448');

            $response
                ->assertStatus(200)
                ->assertSeeText('Product unlinked successfully');
        }
    }


    namespace Tests;

    trait TestRequestsTrait
    {
        /**
         * Returns the response
         *
         * @param $product_id
         * @return \Illuminate\Foundation\Testing\TestResponse
         */
        protected function doProductSoftDelete($product_id)
        {
            $response = $this->actingAsSuperAdmin()->delete('/pages/admin/management/product/soft-delete/'.$product_id);
            return $response;
        }

    }

    namespace Tests;

    use Illuminate\Foundation\Testing\DatabaseTransactions;

    abstract class DatabaseTestCase extends TestCase
    {

        use CreatesApplication;
        use DatabaseTransactions;
    }

1 Ответ

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

Создайте отдельную функцию для выполнения одного и того же поведения дважды:

public function testProductSoftDelete()
{
    doSoftDelete();
}

public function testProductPermanentlyDelete()
{
    doSoftDelete();
    doPermanentDelete();
}

Ваш случай не является случаем тестовой зависимости, но вы действительно хотите проверить, можно ли удалить удаленное программное обеспечение.постоянный удален (или что-то подобное).Создание зависимости в этом случае увеличит сложность теста.Обычно лучше смонтировать тестовый сценарий с нуля (данные / объекты), затем выполнить логику и затем проверить, является ли реальный сценарий ожидаемым.

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