ajthinking
ajthinking

Reputation: 4608

Using PHPUnit to test a Laravel package inside a host application with Github actions?

Summary

I have a package that needs to be wrapped by a real laravel app to be tested properly. Unfortunately I cant use the orchestra testbench. However I have setup a Github action for this. But, when running the final step vendor/phpunit/phpunit/phpunit path/to/package im experiencing the following issues:

Example error

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): 

Reviewing my master branch, the requested file FileTestCase is there.

The full action script:

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/[email protected]
      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

Below is my base test case. But the setUp method is never called. (Previously it was called TestCase as the default laravel provides - it was renamed while debugging)

<?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!");
    }
}

Usage:

<?php

namespace PHPFileManipulator\Tests\Unit;

use PHPFileManipulator\Tests\FileTestCase;

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

versions

Im using PHP 7.4.2 and PHPUnit 8.5.2 (same as github actions ubuntu-latest) Mimicing the action script on my own machine works fine. I have reviewed CASE on github/local found no differences.

Any ideas, what I am missing?

Upvotes: 4

Views: 1431

Answers (1)

ajthinking
ajthinking

Reputation: 4608

I failed updating the host app composer.json repositories section. That meant requiring the package with @dev flag (taking latest commit) had no effect - instead an outdated package version was pulled from packagagist.

Fixed github workflow:

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

Upvotes: 1

Related Questions