【发布时间】:2016-04-23 10:07:28
【问题描述】:
我正在尝试测试我的上传文件功能。我正在模拟 UploadedFile,但我从控制器收到此错误:
[Symfony\Component\Debug\Exception\FatalErrorException]
在非对象上调用成员函数 isValid()
上传的文件(模拟UploadedFile)将被我的控制器接收,但我不能调用UploadedFile的任何方法。
我的控制器:
class FileController extends Controller
{
public function upload(Request $request)
{
return $request->file('file')->isValid();
}
}
我的测试如下:
class FileTest extends TestCase
{
private $fileMock;
public function setUp()
{
parent::setUp();
$this->fileMock = Mockery::mock(Symfony\Component\HttpFoundation\File\UploadedFile::class,
[
'getClientOriginalName' => public_path() . '/images/foo.jpg',
'getClientOriginalExtension' => 'jpg',
'image/jpeg',
null,
null,
true
]);
}
/** @test */
public function it_gets_an_uploaded_file()
{
$this->fileMock
->shouldReceive('isValid')
->once()
->andReturn(true);
$this->call('POST', 'file/upload', [], [], ['file' => [$this->fileMock]]);
$this->assertResponseOk();
}
public function tearDown()
{
Mockery::close();
}
}
【问题讨论】:
-
如果在运行测试时在上传方法中打印出 $request->file('file') 会发生什么?它是 null 还是数组或嘲弄对象?
-
谢谢弗雷德里克。这是嘲弄对象。
-
好的,那么你得到“对非对象的成员函数 isValid() 的调用”很奇怪。如果您打印我们的 Mockery 对象,您应该能够看到该对象上的哪些方法被模拟了。你能看到 isValid() 列在这个对象中吗?
-
mockery对象只有自己的方法shouldReceive()、once()等,没有UploadedFile的方法。模拟“调用”工作正常,我在控制器方法中收到一个文件,但那是只有自己的方法的模拟对象。