Использование PHPUnit для тестирования пакета Laravel внутри хост-приложения с действиями Github? - PullRequest
3 голосов
/ 29 января 2020

Сводка

У меня есть пакет, который должен быть упакован в реальное приложение laravel для правильной проверки. К сожалению, я не могу использовать тестовый стенд оркестра. Однако я настроил действие Github для этого. Но при выполнении последнего шага vendor/phpunit/phpunit/phpunit path/to/package у меня возникают следующие проблемы:

  • PHPUnit не может разрешить определенные классы
  • Он считает, что PHPUnit setUp() опубликован c в хотя мой родительский класс защищен.
  • Я подозреваю, что некоторые проблемы с кэшированием или задержкой после pu sh (но я проверил стирание всего кэша, автозагрузку и конфигурацию)

Пример ошибка

Run vendor/phpunit/phpunit/phpunit packages/Ajthinking/PHPFileManipulator/tests
PHP Fatal error:  Uncaught Error: Class 'PHPFileManipulator\Tests\FileTestCase' not found in /home/runner/work/php-file-manipulator/php-file-manipulator/host/packages/Ajthinking/PHPFileManipulator/tests/Unit/APIDelegationTest.php:10
Stack trace:
#0 /home/runner/work/php-file-manipulator/php-file-manipulator/host/vendor/phpunit/phpunit/src/Util/FileLoader.php(59): include_once()
#1 /home/runner/work/php-file-manipulator/php-file-manipulator/host/vendor/phpunit/phpunit/src/Util/FileLoader.php(47): 

Просмотр моей основной ветки, запрошенный файл FileTestCase там .

Полный сценарий действия:

name: Laravel-wrapped-package-test

on: [push]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
    - name: Install host app
      run: composer create-project --prefer-dist laravel/laravel host

    - name: Install package (this repo)
      uses: actions/checkout@v2
      with:
        path: host/packages/Ajthinking/PHPFileManipulator

    - name: Add this package to composer.json repositories
      uses: ajthinking/merge-json-files@v1.0.20
      with:
        repo_relative_path: 'host/packages/Ajthinking/PHPFileManipulator'

    - name: Require this package
      working-directory: ./host
      run: composer require ajthinking/php-file-manipulator @dev

    - name: Publish things
      working-directory: ./host
      run: php artisan vendor:publish --provider="PHPFileManipulator\ServiceProvider"       

    - name: Run tests
      working-directory: ./host      
      run: vendor/phpunit/phpunit/phpunit packages/Ajthinking/PHPFileManipulator/tests

TestCase

Ниже приведен мой базовый тестовый пример. Но метод setUp никогда не вызывается. (Ранее он назывался TestCase по умолчанию laravel - он был переименован во время отладки)

<?php

namespace PHPFileManipulator\Tests; 

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class FileTestCase extends BaseTestCase  
{
    protected function setUp() : void
    {
        parent::setUp();
        dd("it will never reach this dd call on github actions!");
    }
}

Использование:

<?php

namespace PHPFileManipulator\Tests\Unit;

use PHPFileManipulator\Tests\FileTestCase;

class StupidTest extends FileTestCase
{
    /** @test */
    public function it_can_run_tests()
    {
        $this->assertTrue(true);
    }    
}

версии

Я использую PHP 7.4.2 и PHPUnit 8.5.2 (аналогично действиям github ubuntu-latest). Подражание сценарию действия на моей собственной машине работает нормально. Я просмотрел CASE на github / local, не обнаружил различий.

Есть идеи, чего мне не хватает?

1 Ответ

0 голосов
/ 15 февраля 2020

Я не смог обновить хост-приложение composer.json раздел репозиториев. Это означало, что требование пакета с флагом @dev (с последним подтверждением) не имело никакого эффекта - вместо этого из packagagist была извлечена устаревшая версия пакета.

Исправлен рабочий процесс github:

name: tests

on: [push, pull_request]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
    - name: Install host app
      run: composer create-project --prefer-dist laravel/laravel host

    - name: Checkout the package
      uses: actions/checkout@v2
      with:
        path: host/packages/Ajthinking/PHPFileManipulator

    - name: Add composer.json repository
      working-directory: ./host      
      run: composer config repositories.php-file-manipulator path "/home/runner/work/php-file-manipulator/php-file-manipulator/host/packages/Ajthinking/PHPFileManipulator"

    - name: Require the package
      working-directory: ./host
      run: composer require ajthinking/php-file-manipulator @dev

    - name: Publish things
      working-directory: ./host
      run: php artisan vendor:publish --provider="PHPFileManipulator\ServiceProvider"

    - name: Run tests
      working-directory: ./host      
      run: vendor/phpunit/phpunit/phpunit packages/Ajthinking/PHPFileManipulator/tests
...