Laravel 5.2:测试上传的文件是不是有效:非对象上的 isValid()

Posted

技术标签:

【中文标题】Laravel 5.2:测试上传的文件是不是有效:非对象上的 isValid()【英文标题】:Laravel 5.2 : Test Uploaded File is Valid: isValid() on a non-objectLaravel 5.2:测试上传的文件是否有效:非对象上的 isValid() 【发布时间】: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的方法。模拟“调用”工作正常,我在控制器方法中收到一个文件,但那是只有自己的方法的模拟对象。 【参考方案1】:

问题在于$request->file('file') 是一个数组。因此你需要改变:

public function upload(Request $request)

    return $request->file('file')->isValid();

到这里:

public function upload(Request $request)

    return $request->file('file')[0]->isValid(); 

在您的文件控制器中。

【讨论】:

以上是关于Laravel 5.2:测试上传的文件是不是有效:非对象上的 isValid()的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 中的多张图片上传

Laravel 5.2 或 5.3:如何正确实施检查会话是不是已登录

Laravel 5.2 Auth 登录有效,Auth::check 失败

Connection.php 第 729 行中的 QueryException:SQLSTATE[23000]:Laravel 5.2

带有 Entrust 的 Laravel 5.2 - 类名必须是有效的对象或字符串

如何测试以查看自定义上传器是不是有效?