功能测试中的Symfony 4 Mock服务

时间:2018-07-11 14:44:40

标签: unit-testing symfony4

我正在测试一种服务,该服务实际上主要是对对象进行序列化,然后通过服务将其发送到外部系统。

如果创建典型的单元测试,我将模拟串行器和与外部系统联系的服务的响应。实际上,除了在我的对象中调用一堆setter方法外,没有什么要测试的了。

另一种选择是使用KernelTestCase并创建一个功能测试,这很好,除非我不想联系外部系统,而只对这个“外部”服务使用一个模拟。

在Symfony 4中是否有可能实现这一目标? 还是有另一种方法?

我现在正在做的是以下事情:

 param(
 [string]$ServiceNames
)
if([string]::IsNullOrWhiteSpace($ServiceNames))
{
   throw "Missing argument [-ServiceNames $ServiceNames]"
}
    $Services=$ServiceNames.Split(",")
    foreach($Service in $Services)
{
   if(Get-Service $Service | Where {$_.status –eq 'Stopped'})
{
   Get-Service $Service | Where {$_.status –eq 'Stopped'} | Start-Service
   Write-Host "$Service has been started."
}
else
{
   Write-Host "$Service is already running."
}
}

返回此错误:

if(Get-Service $Service | Where {$_.status â?"eq 'Stopped'})

2 个答案:

答案 0 :(得分:3)

您不应将designation注入服务。您应该使用Request而不是Symfony\Component\HttpFoundation\RequestStack。另外,您应该检查Request是否不返回$requestStack->getCurrentRequest()。我想您在容器的初始化过程中会遇到这样的错误,但是您只执行脚本(测试),并且当然没有null

答案 1 :(得分:0)

由于整个事情都需要进一步调整,因此我发布了Nikita的答案导致我解决的方案:

正如他所建议的那样,我将“服务中的请求替换为RequestStack,效果很好:

/**
 * @param LoggerInterface     $logger
 * @param SerializerInterface $serializer
 * @param ExternalClient      $externalClient
 * @param RequestStack        $requestStack
 */
public function __construct(
    LoggerInterface $logger,
    SerializerInterface $serializer,
    ExternalClient $externalClient,
    RequestStack $requestStack
) {
    $this->logger = $logger;
    $this->serializer = $serializer;
    $this->externalClient = $externalClient;
    $this->request = $requestStack->getCurrentRequest();
    $this->params = $this->request->query;
}

在我的测试中,我伪造了这样的请求:

    $this->request = new Request($getParams, [], [], [], [], [], null);

    $this->requestStack = new RequestStack();
    $this->requestStack->push($this->request);

但是,由于解决了这个问题,我的下一个问题出现了,因为我的课也要求使用记录器和序列化器。 对于Logger,我使用了为该测试情况专门创建的常规Logger类。但这让我得到了序列化器,我想要一个真正的序列化器,否则我可能会坚持使用几乎没有用的UnitTest。

那是我所做的:

public function setUp()
{
    $kernel = self::bootKernel(); 
    $container = self::$container;
    $this->serializer = $container->get('jms_serializer.serializer');

然后这给了我来自容器的真正的序列化器。 现在,我可以让受嘲弄的外部客户端为我提供受嘲讽的答案,并且可以测试我的服务的响应而无需打扰外部服务。