我正在测试一种服务,该服务实际上主要是对对象进行序列化,然后通过服务将其发送到外部系统。
如果创建典型的单元测试,我将模拟串行器和与外部系统联系的服务的响应。实际上,除了在我的对象中调用一堆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'})
答案 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');
然后这给了我来自容器的真正的序列化器。 现在,我可以让受嘲弄的外部客户端为我提供受嘲讽的答案,并且可以测试我的服务的响应而无需打扰外部服务。