Creating a base test-class for PHPUnit and extending it for common functionality results in class not found error

空扰寡人 提交于 2019-12-20 17:38:22

问题


I'm running PHPUnit using a bootstrap file for autoloading classes (generated by composer).

All my tests load up classes just fine, but for two of my tests, I made a "base" test class which extends PHPUnit_Framework_TestCase, and then two test classes that extend the base class, similar structure to the following example code:

abstract class BaseTest extends PHPUnit_Framework_TestCase
{
    abstract function setUp();
    protected function getCommonTestVariables()
    {
        // ...
    }

    protected function runCommonTests()
    {
        // ...
    }
}
class BlahBlahTest extends BaseTest
{
    public function setUp()
    {
         $variables=$this->getCommonTestVariables();
         //etc...
    }

    public function testThings()
    {
        $this->runCommonTests();
    }
}

Whenever I run this, PHPUnit gives an error:

Fatal error: Class 'BaseTest' not found in BlahBlahTest.php on line 13

I've checked filenames, locations, namespaces and everything seems to be in order. Any help would be appreciated to get to the bottom of this


回答1:


I ran into the same problem and if you are not too familiar with the inner workings of both PHPUnit and Composer this can indeed seem perplexing.

PHPunit does not use use the Composer autoloader to find any of your test classes. It just scans any directory you give it and operates on one file at a time.

Hence it does not know about any other class than the one in the file it is currently operating on. That is where the bootstrap file comes into play.

If you want to use the Composer Autoloader to load other test classes, you need to tell it where it can find these test classes (and, optionally, in which namespace).

There are two ways to do this:

  1. Add an autoload-dev section to your composer.json or
  2. Add the test directory to the Composer Autoloader

Use autoload-dev

The autoload-dev sections allows you to define autoload rules for development purposes.

Quoting directly from the manual:

Classes needed to run the test suite should not be included in the main autoload rules to avoid polluting the autoloader in production and when other people use your package as a dependency.

Therefore, it is a good idea to rely on a dedicated path for your unit tests and to add it within the autoload-dev section.

Example:

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" }
    }
}

Add to the Composer Autoloader

An alternative would be to get the Composer Autoloader and add your testing namespace (if you have any) and the directory where your tests live. How to do this, as described in the manual (at the bottom of the autoloading section in "Basic Usage") is :

$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test\\', __DIR__ . '/Tests');

If your tests use namespaces that mirror the test directory and you still run into trouble, you can try omitting the prefix by replacing the first parameter ('Test\\') with ''.


If you want further insight into how all of this works you should take a look at the Composer ClassLoader class, especially the add() and findFile() methods.




回答2:


For me the solution was much simpler.

  1. I changed the capital letter of Test to test at the end of the file and the class name

BaseSomethingtest.php

<?php

namespace Something\Tests\Sub1\Sub2;

class BaseSomethingtest
{
}
  1. I just put a word at the end of my base class. As far as it didn't finish with Test, phpunit didn't call it

BaseSomethingTestCase.php

<?php

namespace Something\Tests\Sub1\Sub2;

class BaseSomethingTestCase
{
}



回答3:


I'm not sure if you still need a solution, but this worked for me:
Non-testable base class extending PHPUnit_Framework_TestCase




回答4:


In PHP 7.0+ extends PHPUnit_Framework_TestCasechanged to extends \PHPUnit\Framework\TestCase, try this one.



来源:https://stackoverflow.com/questions/18880067/creating-a-base-test-class-for-phpunit-and-extending-it-for-common-functionality

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!