如何获取包含依赖项的单元测试包类

时间:2012-01-15 23:28:28

标签: unit-testing symfony phpunit

我有一个Symfony 2项目和一些定义的包含其他服务依赖项的自定义类(服务)。我无法弄清楚如何使用服务容器测试我的类。例如,我有以下类;

namespace My\FirstBundle\Helper;
use Symfony\Component\DependencyInjection\ContainerInterface;

class TextHelper {

    public function __construct(ContainerInterface $container) {
//.. etc

现在在我的单元测试中,我会像在任何其他情况下一样扩展\ PHPUnit_Framework_TestCase,但是如何测试具有依赖项的TextHelper类?我可以在新的services_test.yml文件中定义我的服务吗?如果是的话,应该去哪里?

1 个答案:

答案 0 :(得分:2)

我以前没有使用过Symfony 2,但我希望你可以创建必要的依赖项 - 或者更好的模拟对象 - 并将它们放入容器中进行每次测试。

例如,假设您要测试TextHelper::spellCheck()哪个应该使用字典服务查找每个单词并替换任何不正确的单词。

class TextHelperTest extends PHPUnit_Framework_TestCase {
    function testSpellCheck() {
        $container = new Container;
        $dict = $this->getMock('DictionaryService', array('lookup'));
        $dict->expects($this->at(0))->method('lookup')
                ->with('I')->will($this->returnValue('I'));
        $dict->expects($this->at(1))->method('lookup')
                ->with('kan')->will($this->returnValue('can'));
        $dict->expects($this->at(2))->method('lookup')
                ->with('spell')->will($this->returnValue('spell'));
        $container['dictionary'] = $dict;
        $helper = new TextHelper($container);
        $helper->setText('I kan spell');
        $helper->spellCheck();
        self::assertEquals('I can spell', $helper->getText());
    }
}