我正在尝试测试一个数据传输对象类,该类在 Laravel 中构造SymfonyComponentHttpFoundationFileUploadedFile.php
类。我没有运气在PHPSpec
中测试此实现。这是我到目前为止所拥有的:
测试
public function let($event_id)
{
$prophet = new Prophet;
$prophecy = $prophet->prophesize();
$prophecy->willBeConstructedWith(array('path', 'name'));
$prophecy->willExtend('SymfonyComponentHttpFoundationFileUploadedFile');
$attendee_list = $prophecy->reveal();
$this->beConstructedWith($event_id, $attendee_list);
}
public function it_is_initializable()
{
$this->shouldHaveType('CaptixAttendeesImportAttendeesCommand');
}
类
class ImportAttendeesCommand
{
/**
* Event primary key
* @var $event_id
*/
protected $event_id;
/**
* CSV file
* @var $attendee_list
*/
protected $attendee_list;
/**
* Constructor for ImportAttendeesCommand
*/
public function __construct($event_id, UploadedFile $attendee_list)
{
$this->event_id = $event_id;
$this->attendee_list = $attendee_list;
}
}
结果
2 -_-__,------,
0 -_-__| /_/
0 -_-_^|__( o .o)
1 -_-_ "" ""
Captix/Attendees/ImportAttendeesCommand
38 ! it is initializable
exception [exc:SymfonyComponentHttpFoundationFileExceptionFileNotFoundException("The file "path" does not exist")] has been thrown.
0 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php:41
throw new SymfonyComponentHttpFoundationFileExceptionFileNotFoundException("The file "path" does not ...")
1 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php:100
SymfonyComponentHttpFoundationFileFile->__construct("path", true)
2 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php(49) : eval()'d code:6
SymfonyComponentHttpFoundationFileUploadedFile->__construct("path", "name", null, null, null, null)
3 [internal]
DoubleSymfonyComponentHttpFoundationFileUploadedFileP4->__construct("path", "name")
4 vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php:109
ReflectionClass->newInstanceArgs([array:2])
5 vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php:119
ProphecyDoublerDoubler->double([obj:ReflectionClass], [array:0], [array:2])
6 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php:114
ProphecyDoublerLazyDouble->getInstance()
7 app/Spec/Captix/Attendees/ImportAttendeesCommandSpec.php:33
ProphecyProphecyObjectProphecy->reveal()
8 [internal]
SpecCaptixAttendeesImportAttendeesCommandSpec->let([obj:PhpSpecWrapperCollaborator])
3 examples (2 passed, 1 broken)
119ms
我已经尝试了几种方法来测试这一点,使用Mockery,Prohpecy,stdClass,似乎没有任何效果。对此的任何帮助将不胜感激。我欢迎此测试的任何实施。提前感谢大家。
创建一个接口:
interface UploadedFileInterface
{}
创建实现此接口并扩展 Symfony 类的类。
class MyUploadedFile extends UploadedFile implements UploadedFileInterface
{}
更改命令中的构造函数:
public function __construct($event_id, UploadedFileInterface $attendee_list)
{
$this->event_id = $event_id;
$this->attendee_list = $attendee_list;
}
现在,您可以轻松地单独测试您的类:
public function let($event_id, UploadedFileInterface $attendeeList)
{
$this->beConstructedWith($event_id, $attendeeList);
}
如果有一天你将不得不从Symfonys UploadedFile
切换到另一个实现,你唯一需要改变的地方将是MyUploadedFile
类。
我在使用预言来模拟上传文件时遇到了同样的问题,所以我提交了一个问题以供反馈 (https://github.com/phpspec/prophecy/issues/184)。
解决方案是"不要嘲笑你不拥有的东西"。我还不确定您将如何将其付诸实践,但我想您可能会感兴趣。