我正在尝试测试一个用Laravel中的Symfony\Component\HttpFoundation\File\UploadedFile.php类构造的数据传输对象类。我没有在PHPSpec中测试过这个实现。这是我到目前为止所知道的:
测试
public function let($event_id)
{
$prophet = new Prophet;
$prophecy = $prophet->prophesize();
$prophecy->willBeConstructedWith(array('path', 'name'));
$prophecy->willExtend('Symfony\Component\HttpFoundation\File\UploadedFile');
$attendee_list = $prophecy->reveal();
$this->beConstructedWith($event_id, $attendee_list);
}
public function it_is_initializable()
{
$this->shouldHaveType('Captix\Attendees\ImportAttendeesCommand');
}班级
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:Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException("The file "path" does not exist")] has been thrown.
0 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php:41
throw new Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException("The file "path" does not ...")
1 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php:100
Symfony\Component\HttpFoundation\File\File->__construct("path", true)
2 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php(49) : eval()'d code:6
Symfony\Component\HttpFoundation\File\UploadedFile->__construct("path", "name", null, null, null, null)
3 [internal]
Double\Symfony\Component\HttpFoundation\File\UploadedFile\P4->__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
Prophecy\Doubler\Doubler->double([obj:ReflectionClass], [array:0], [array:2])
6 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php:114
Prophecy\Doubler\LazyDouble->getInstance()
7 app/Spec/Captix/Attendees/ImportAttendeesCommandSpec.php:33
Prophecy\Prophecy\ObjectProphecy->reveal()
8 [internal]
Spec\Captix\Attendees\ImportAttendeesCommandSpec->let([obj:PhpSpec\Wrapper\Collaborator])
3 examples (2 passed, 1 broken)
119ms我尝试了几种方法来测试它,使用Mockery,Prohpecy,stdClass,似乎都不起作用。在这方面的任何帮助都将非常感谢。我欢迎这个测试的任何实现。提前感谢所有人。
发布于 2015-05-04 03:11:02
创建一个接口:
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);
}如果有一天您必须从symfony类切换到另一个实现,那么您唯一需要更改的地方将是MyUploadedFile类。
发布于 2015-04-30 07:02:55
我在使用prophecy模拟UploadedFile时也遇到了同样的问题,所以我提交了一个问题征求反馈(https://github.com/phpspec/prophecy/issues/184)。
解决方案是“不要嘲笑你不拥有的东西”。我还不确定您将如何将其付诸实践,但我想您可能会感兴趣。
https://stackoverflow.com/questions/29640748
复制相似问题