【发布时间】:2014-02-17 04:19:29
【问题描述】:
我目前正在使用 Phpspec 进行 Symfony2 项目,但在扩展不同命名空间中描述的 Spec 类时遇到问题。
例如,在我的项目中,spec/Acme/Model/Foo/FooSpec.php 中描述了以下类:
namespace spec\Acme\Model\Foo;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
abstract class FooSpec extends ObjectBehavior{
//some code here
}
我在spec/Acme/Model/Bar/BarSpec.php 中还有一个类扩展FooSpec:
namespace spec\Acme\Model\Bar;
use spec\Acme\Model\Foo\FooSpec;
class BarSpec extends FooSpec{
//some code here
}
当我尝试运行 phpspec 时,出现以下错误:
PHP Fatal error: Class 'spec\Acme\Model\Foo\FooSpec' not found in /home/user/Projects/Acme/spec/Acme/Model/Bar/BarSpec.php on line 9
我发现使它工作的唯一方法是在spec/Acme/Model/Bar/BarSpec.php 中添加以下行:
include('./spec/Acme/Model/Foo/FooSpec.php');
我不知道为什么我必须包含这个特定文件才能使其运行,尤其是在正确找到其他类(如 PhpSpec\ObjectBehavior)时。
你知道为什么会这样吗?
编辑:
正如 @Phil 和 @Sheikh Heera 在 cmets 中所建议的那样,我尝试设置一个 autoload 来注册我的规范命名空间,但它也不起作用。这是我到目前为止所尝试的:
require_once getcwd() . '/vendor/composer/ClassLoader.php';
$loader = new \Composer\Autoload\ClassLoader();
// register classes with namespaces
$loader->add('spec', getcwd().'/spec');
// activate the autoloader
$loader->register();
我也尝试修改文件vendor/composer/autoload_namespaces.php 来添加这个:
return array(
//some code here
'spec' => array(getcwd() . '/spec'),
//some more code
);
但仍然是同样的错误。我还尝试使用'spec' => array(getcwd()) 或$loader->add('spec', getcwd()); 只是为了看看会发生什么,这次我在另一个规范类上得到了Cannot redeclare class。
我的php版本是PHP 5.4.9-4ubuntu2.4 (cli)。
提前感谢您的帮助。
【问题讨论】:
-
您是否为 PHPSpec 知道的
spec命名空间设置了自动加载器? -
Check this,它可能会有所帮助。
-
@SheikhHeera 和 Phil,我更新了我的问题
-
我相信这是因为 PHPSpec 的创建者并不打算让您的测试扩展其他测试。你为什么要这样做?
-
@CarlOwens,我这样做是因为我有一个抽象类,它被其他 3 个类继承(目前)。我不想在每个孩子中复制粘贴抽象类的规范,但我想确保这 3 个孩子具有相同的行为。因此,我想让它们扩展抽象类。你可以看看这个讨论:PhpSpec - Issue #54Marijn 做的和我想做的一样。
标签: php symfony classnotfound phpspec