通过具体类测试抽象类



我对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"

相关内容

  • 没有找到相关文章

最新更新