私はPHPSpec 2.0.0でSymfonyアプリケーションでDoctrineクエリビルダーを使うテストを書いています。これは私のクラスである:ここではphpspec doctrine queryBuilder - mock
class RedirectHandle
{
/**
* @var string
*/
private $kernelEnvironment;
/**
* @var ContainerInterface
*/
private $container;
/**
* RedirectHandle constructor.
* @param $env
* @param ContainerInterface $containerInterface
*/
public function __construct($env, ContainerInterface $containerInterface)
{
$this->kernelEnvironment = $env;
$this->container = $containerInterface;
}
public function handleUrl($url)
{
if ($this->kernelEnvironment === "dev") {
$em = $this->container->get("doctrine")->getEntityManager();
return $em->createQuery("SELECT a FROM module_redirect a WHERE url_from_redirect = :url ")
->setParameter('url', $url)
->getSingleScalarResult();
}
return false;
}
}
は私のPHPSpecのテストです:
class RedirectHandleSpec extends ObjectBehavior
{
function let($kernel,$container,$queryBuilder,$em,$redirectHandle)
{
$env = "dev";
$kernel->beADoubleOf('Symfony\Component\HttpKernel\Kernel');
$kernel->getEnvironment()->willReturn($env);
$queryBuilder->beADoubleOf('Doctrine\ORM\QueryBuilder');
$container->beADoubleOf('Symfony\Component\DependencyInjection\ContainerInterface');
$redirectHandle->beADoubleOf('Kei\WebsiteBundle\Tools\Redirect\RedirectHandle');
$em->beADoubleOf('Doctrine\ORM\EntityManager');
$kernel->getContainer()->willReturn($container);
$this->beConstructedWith($env,$container);
}
function it_is_initializable()
{
$this->shouldHaveType('Kei\WebsiteBundle\Tools\Redirect\RedirectHandle');
}
function it_is_init_redirect_when_env_is_dev($container,$queryBuilder,$em)
{
$container->get("doctrine")->willReturn($queryBuilder);
$em->createQuery(Argument::any())->willReturn($em);
$this->handleUrl("test")->shouldBeReturn(true);
}
}
私がテストを実行したときに、私は次のエラーを得た:
1PHP Fatal error: Uncaught Error: Call to a member function createQuery() on null in /var/www/kei-site/src/Kei/WebsiteBundle/Tools/Redirect/RedirectHandle.php:37
Stack trace:
#0 [internal function]: Kei\WebsiteBundle\Tools\Redirect\RedirectHandle->handleUrl('test')
#1 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject/Caller.php(260): call_user_func_array(Array, Array)
#2 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject/Caller.php(97): PhpSpec\Wrapper\Subject\Caller->invokeAndWrapMethodResult(Object(Kei\WebsiteBundle\Tools\Redirect\RedirectHandle), 'handleUrl', Array)
#3 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject.php(187): PhpSpec\Wrapper\Subject\Caller->call('handleUrl', Array)
#4 [internal function]: PhpSpec\Wrapper\Subject->__call('handleUrl', Array)
#5 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/ObjectBehavior.php(136): call_user_func_array(Array, Array)
#6 /var/www/kei-site/spec/Kei/WebsiteBundle/Tools/Redirect/RedirectHandleSpec.php(40): PhpSpec\Obj in /var/www/kei-site/src/Kei/WebsiteBundle/Tools/Redirect/RedirectHandle.php on line 37
は私が修正するために何をすべきこの?
あなたはサービスロケータパターンをオフに取り除くために、あなたのコードをリファクタリングしてくださいもらえますか?実際に必要なサービスだけをコンテナ全体に注入しないでください。それをテストすることから始めると、すべてがより簡単になったことがわかります。作成しているクエリを持つリポジトリを挿入します。 – mmmm
"サービスロケータのパターンを取り除くためにコードをリファクタリングしてもらえますか?" phpspecから気になりますか? "$ container-> get(" doctrine ") - > willReturn($ queryBuilder)"を削除する必要がありますか? –
いいえ、 'RedirectHandle'クラスです。私が書いたことをそこに注入すると、それはより清潔でテストしやすくなります。 – mmmm