单元测试 上传文件.php 在 PHPSpec 中



我正在尝试测试一个数据传输对象类,该类在 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)。

解决方案是"不要嘲笑你不拥有的东西"。我还不确定您将如何将其付诸实践,但我想您可能会感兴趣。

相关内容

  • 没有找到相关文章

最新更新