我有将服务公开的解决方案。在services.yml
test_phpdocxService:
alias: App\Service\PhpDocxService
public: true
我尝试访问该服务:
$container = self::$container;
$phpDocxService = $container->get('test_phpdocxService');
$this->filename = $phpDocxService->generateDocxDocument('docx/aaa.html.twig', $data);
但是我发现它不是很好。还有另一种方法吗?
答案 0 :(得分:3)
您需要在config/config_test.yml
中创建并声明该服务是公共的,并且在那里进行测试的其他配置。
您可以在symfony 3/4中使用这种方法。
您可以在此处阅读教程:topic at this AWS support forum
关于https://symfonycasts.com/screencast/phpunit/integration-tests,请阅读@Cerad帖子
答案 1 :(得分:1)
好的。因此,有issue关于测试您的应用程序中未使用的私有服务的信息。它仍然是开放的并且正在讨论中,但是基本上,就目前而言,您需要在应用程序中的某个地方针对您的私有服务键入提示,然后才能在测试中访问它。
使用全新的4.4.2安装:
# src/Service/PhpDocxService.php
namespace App\Service;
class PhpDocxService
{
public function sayHello()
{
return 'hello';
}
}
# src/Controller/MyController.php
namespace App\Controller;
use App\Service\PhpDocxService;
class MyController
{
#****** This is the secret ******
public function __construct(PhpDocxService $phpDocxService)
{
}
}
# src/tests/MyTest.php
namespace App\Tests;
use App\Service\PhpDocxService;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class MyTest extends WebTestCase
{
public function testServiceFound()
{
self::bootKernel();
// gets the special container that allows fetching private services
$container = self::$container;
$phpDocxService = $container->get(PhpDocxService::class);
$this->assertEquals('hello',$phpDocxService->sayHello());
}
}
在控制器的构造函数中键入服务提示,一切都会按预期进行。
答案 2 :(得分:0)
自动装配自Symfony 3.4开始存在,但在4.x版本中,默认情况下已激活。
因此,/ src目录中的所有类都是公共的,并被设置为服务。
转到 /config/services.yaml ,您将找到以下代码:
def student_page(request, html_file):
if request.user.is_authenticated:
if request.user.groups.filter(name__in=[group]).exists():
return render(request, 'Students/%s.html'%(html_file), {})
else:
return redirect('accounts:login')
else:
return redirect('accounts:login')
这意味着您的 /src/Services/PhpDocxService.php 文件可由 App / Services / PhpDocxService 调用strong>
找到的解决方案是通过services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
呼叫服务
答案 3 :(得分:0)
您不要! :)
相反,您使用在Symfony 4.1中实现的新Simpler service testing。
有了它,基于WebTestCase和KernelTestCase的测试现在可以通过static :: $ container属性访问一个特殊的容器,该属性允许获取未删除的私有服务。
这意味着如果您使用该容器,则私有服务会在测试中自动公开。
只需执行以下操作:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SomeClassToTest extends WebTestCase
{
public function getService(string $service)
{
self::bootKernel();
$container = self::$kernel->getContainer();
$container = self::$container;
return self::$container->get($service);
}
public function tesSomething()
{
$imageProcessor = $this->getService('app.some.service');
}
现在,您可以在测试环境中获得私有的“ app.some.service”服务。