PHPUnit:将模拟对象作为方法参数传递

时间:2013-05-19 10:46:08

标签: mocking phpunit stubbing

说我有以下课程:

class Document
{
  private file;

  public function setFile(UploadedFile $file)
  {
    $this->file = $file;
  }

  public function getExt()
  {
    return $this->file->guessExtension();
  }
}

我想测试getExt()方法。我尝试按如下方式设置测试:

$file = $this->getMock('UploadedFile');

$file->expects($this->at(0))
  ->method('guessExtension')
  ->will($this->returnValue('png'));

$doc = new Document();
$doc->setFile($file);
...

但是,它给我一个错误,说setFile()期望一个UploadedFile的实例,而是找到了mock对象。任何人都可以了解如何测试这种情况吗?在使用模拟和存根进行测试时,我是初学者。

谢谢!

2 个答案:

答案 0 :(得分:0)

感谢fab的评论。我做了以下更改并使其正常工作,

$file = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
        ->disableOriginalConstructor()
        ->getMock();

答案 1 :(得分:-1)

自PHP 5.5.16起,Chieh解决方案不再使用。 See reference.

可能的解决方案是在/tmp中使用setUp()/tearDown()创建一个临时虚拟文件,并将其传递给构造函数。然后我们模拟了返回所需内容的必要方法。

注意UploadedFile将要求您传递两个参数