我对PHPSpec和BDD真的很陌生,所以,也许,我的假设是不好的,在这种情况下,请纠正我。
让我们考虑这个场景
//src/myBundle/Model/FooInterface
interface FooInterface
{
[...]
}
//src/myBundle/Model/FooAbstractManager
abstract class FooAbastractManager implements FooInterface
{
public function aCommonMethodForAllConcrete()
{
[...]
}
}
好,假设aCommonMethodForAllConcrete()
与所有具体类共享一些实现,并且我只想编写一次测试用例。
我终于(如果我错了请纠正我)有了一个"想法":创建一个具体的FooAbstractManager
仅用于测试这个通用方法,并将所有具体方法测试留给具体类。
但是,因为我不希望这个FooAbstractManager
成为我的src
代码库的一部分,完美的情况是仅将该类包含在spec
文件夹的特定子目录中。
问题:我怎么能自定义行为没有指定所有/src/myBundle/Model
名称间隔文件将在那里(因为,也许明天,我需要保持一个具体的类文件在那里)?
看一下这个例子,它满足了您的需要:https://github.com/Sylius/Translation/blob/master/spec/Model/AbstractTranslatableSpec.php
您是对的,您可以创建一个仅用于测试的具体类。它必须扩展抽象类,并为抽象类的抽象方法(如果有的话)提供虚拟实现。
因为这个为测试而创建的类只是抽象类的一个薄覆盖,它自己不提供任何功能,它只在单个spec
中使用,您甚至不需要将它放入自己的文件中。把它放到spec
文件的末尾。
这是一种测试抽象类的"官方"方式。查看phpspec
创建者之一撰写的这篇文章的"限制#5"