PHPUnit 模拟对象不起作用



我是PHPUnit中嘲笑对象的新手,无法让它工作。我正在构建当前SensioGeneratorBundle的扩展(用于Symfony2)。我使用通过PEAR安装的PHPUnit 3.7。它运行在 PHP 5.3.5 上(因为 PEAR 安装在该版本中)。

我的剥离类是:

控制器生成器.php

class ControllerGenerator extends Generator
{
    // ...
    public function generate(BundleInterface $bundle, $controller, array $actions = array())
    {
        // ...
    }
}

GenerateControllerCommand.php

class GenerateControllerCommand extends ContainerAwareCommand
{
    private $generator;
    /**
     * @see Command
     */
    public function configure()
    {
        // ...
    }
    public function execute(InputInterface $input, OutputInterface $output)
    {
        // ...
        $generator = $this->generator;
        $generator->generate($bundle, $controller);
        // ...
    }
    protected function getGenerator()
    {
        if (null === $this->generator) {
            $this->generator = new ControllerGenerator($this->getContainer()->get('filesystem'), __DIR__.'/../Resources/skeleton/bundle');
        }
        return $this->generator;
    }
    public function setGenerator(ControllerGenerator $generator)
    {
        $this->generator = $generator;
    }
}

GenerateControllerCommandTest.php

class GenerateControllerCommandTest extends GenerateCommandTest
{
    public function testNonInteractiveCommand()
    {
        $bundle = 'FooBarBundle';
        $controller = 'PostController';
        $input = array(
            'command' => 'generate:controller',
            '--bundle' => $bundle,
            '--controller' => $controller,
        );
        $application = $this->getApplication();
        $commandTester = $this->getCommandTester($input);
        $generator = $this->getGenerator();
        $generator
            ->expects($this->once())
            ->method('generate')
            ->with($this->getContainer()->get('kernel')->getBundle($bundle), $controller)
        ;
        $commandTester->execute($input, array('interactive' => false));
    }
    protected function getCommandTester($input = '')
    {
        return new CommandTester($this->getCommand($input));
    }
    protected function getCommand($input = '')
    {
        return $this->getApplication($input)->find('generate:controller');
    }
    protected function getApplication($input = '')
    {
        $application = new Application();
        $command = new GenerateControllerCommand();
        $command->setContainer($this->getContainer());
        $command->setHelperSet($this->getHelperSet($input));
        $command->setGenerator($this->getGenerator());
        $application->add($command);
        return $application;
    }
    protected function getGenerator()
    {
        // get a noop generator
        return $this
            ->getMockBuilder('SensioBundleGeneratorBundleGeneratorControllerGenerator')
            ->disableOriginalConstructor()
            ->setMethods(array('generate'))
            ->getMock()
        ;
    }
}

当我运行PHPUnit时,我不断收到此错误:

 $ phpunit TestsCommandGenerateControllerCommandTest
     PHPUnit 3.7.0 by Sebastian Bergmann.
     Configuration read from E:Wouterwebwampwwwwjsnipvendorsensiogenerator-bundleSensioBundleGeneratorBundlephpunit.xml.dist
     F
     Time: 2 seconds, Memory: 7.25Mb
     There was 1 failure:
     1) SensioBundleGeneratorBundleTestsCommandGenerateControllerCommandTest::testNonInteractiveCommand
     Expectation failed for method name is equal to <string:generate> when invoked 1 time(s).
     Method was expected to be called 1 times, actually called 0 times.
     E:Wouterwebwampbinphpphp5.3.5PEARphpunit:46
     FAILURES!
     Tests: 1, Assertions: 7, Failures: 1.

为什么我会收到此错误?我想我在GenerateControllerCommand::execute方法中调用了generate命令?我做错了什么,可能是真的吗?或者这是PHPunit中的一个错误?

简而言之

生成两个不同的$generator对象。呼叫发生在一个呼叫上,而另一个expect它。

<小时 />

您更改了行为protected function getGenerator()但原始函数期望调用该函数填充$this->generator

您的测试无法正常工作,并且该函数希望始终获得相同的生成器,并且在覆盖后,函数返回两个不同的对象。

您在一个对象上设置了预期的调用,并且调用发生在对象上。

只是看:

    $generator = $this->getGenerator();
    $generator
        ->expects($this->once())
        ->method('generate')
        ->with($this->getContainer()->get('kernel')->getBundle($bundle), $controller)
    ;
    $commandTester->execute($input, array('interactive' => false));
}

$generator变量不会放在任何地方的任何对象作用域中,因此不会对其进行调用,因为每次调用$this->getGenerator()都会生成一个未存储在任何地方的新对象。

所以在

protected function getApplication() {
    //...
    $command->setGenerator($this->getGenerator());
    //...
}

您的对象与测试用例中的对象不同。

相关内容

  • 没有找到相关文章

最新更新