代码之家  ›  专栏  ›  技术社区  ›  Erfan Sabouri

在laravel中测试多存储

  •  0
  • Erfan Sabouri  · 技术社区  · 2 年前

    我在尝试模拟multi时遇到问题 Storage 在laravel测试环境中。

    这是我的密码:

    public function sftp ( Sibling $sibling ) {
            $file_paths = Storage::build($sibling->config)
                                 ->files($this->track->track_token);
            Storage::disk('public')
                   ->makeDirectory($this->track->track_token);
            foreach ( $file_paths as $file_path ) {
                $file_content = Storage::build($sibling->config)
                                       ->get($file_path);
                TrackMp3::query()
                        ->where('track_id' , $this->track->id)
                        ->where('file_name' , basename($file_path))
                        ->update([
                                     'downloaded_at' => now() ,
                                 ]);
                Storage::disk('public')
                       ->put($file_path , $file_content);
            }
        }
    

    这是我的测试用例:

    
    
    public function test_sftp_works_when_track_exists_in_sibling () {
            $track_token = md5('sample');
            $track_320 = UploadedFile::fake()
                                     ->create('track_320.mp3')
                                     ->getContent();
            $track_160 = UploadedFile::fake()
                                     ->create('track_160.mp3')
                                     ->getContent();
            $track_96 = UploadedFile::fake()
                                    ->create('track_96.mp3')
                                    ->getContent();
            $track_demo = UploadedFile::fake()
                                      ->create('track_demo.mp3')
                                      ->getContent();
            $sibling = SiblingFactory::new()
                                     ->create();
            $public_disk = Storage::fake('public');
            $sibling_disk = Storage::fake('sibling');
            Storage::shouldReceive('build')
                   ->with($sibling->config)
                   ->andReturn($sibling_disk);
            $sibling_disk->put($track_token . '/track_320.mp3' , $track_320);
            $sibling_disk->put($track_token . '/track_160.mp3' , $track_160);
            $sibling_disk->put($track_token . '/track_96.mp3' , $track_96);
            $sibling_disk->put($track_token . '/track_demo.mp3' , $track_demo);
            $track = TrackFactory::new()
                                 ->md5Fetched()
                                 ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_320.mp3')) ])
                                                      ->fileName320())
                                 ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_160.mp3')) ])
                                                      ->fileName160())
                                 ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_96.mp3')) ])
                                                      ->fileName96())
                                 ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_demo.mp3')) ])
                                                      ->fileNameDemo())
                                 ->create([ 'track_token' => $track_token ]);
    
            Storage::fake('public'); // ----> Error happend here
            Artisan::call('download');
        }
    

    以下是错误:

    Mockery\Exception\BadMethodCallException: Received Mockery_2_Illuminate_Filesystem_FilesystemManager::createLocalDriver(), but no expectations were specified
    C:\Development\projects\track-download-manager\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:353
    C:\Development\projects\track-download-manager\vendor\laravel\framework\src\Illuminate\Support\Facades\Storage.php:107
    C:\Development\projects\track-download-manager\tests\Feature\DownloadCommandTest.php:55
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   Jeyhun Rashidov    2 年前

    您已经多次调用Storage::fake()。首先是兄弟姐妹,然后是公众。当你第二次调用它时,Laravel正试图创建一个本地磁盘,因为你之前嘲笑过Storage facade,所以测试失败了。

    关键是在你设置任何模拟之前先设置你的赝品。

    $public_disk = Storage::fake('public');
    $sibling_disk = Storage::fake('sibling');
    
    Storage::shouldReceive('build')
        ->with($sibling->config)
        ->andReturn($sibling_disk);
    

    如果你没有检查与 Storage::build 在这个测试中,只需要确保文件正确放置在同级磁盘和公共磁盘上,就可以考虑删除 shouldReceive('build') 嘲弄。

    如果您仍然面临问题,您可以在完成模拟实例后重置它,以确保后续调用不会产生副作用。

    Storage::swap($this->app['files']);
    
        2
  •  0
  •   Erfan Sabouri    2 年前

    最后解决它。

    我忘了模拟公共磁盘。

        public function test_sftp_works_when_track_exists_in_sibling () {
                $track_token = md5(rand());
                $track_320 = UploadedFile::fake()
                                         ->create('track_320.mp3')
                                         ->getContent();
                $track_160 = UploadedFile::fake()
                                         ->create('track_160.mp3')
                                         ->getContent();
                $track_96 = UploadedFile::fake()
                                        ->create('track_96.mp3')
                                        ->getContent();
                $track_demo = UploadedFile::fake()
                                          ->create('track_demo.mp3')
                                          ->getContent();
                $sibling = SiblingFactory::new()
                                         ->create();
                $public_disk = Storage::fake('public');
                $sibling_disk = Storage::fake('sibling');
                Storage::shouldReceive('build')
                       ->with($sibling->config)
                       ->andReturn($sibling_disk);
                Storage::shouldReceive('disk')
                       ->with('public')
                       ->andReturn($public_disk);
                $sibling_disk->put($track_token . '/track_320.mp3' , $track_320);
                $sibling_disk->put($track_token . '/track_160.mp3' , $track_160);
                $sibling_disk->put($track_token . '/track_96.mp3' , $track_96);
                $sibling_disk->put($track_token . '/track_demo.mp3' , $track_demo);
                $track = TrackFactory::new()
                                     ->md5Fetched()
                                     ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_320.mp3')) ])
                                                          ->fileName320())
                                     ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_160.mp3')) ])
                                                          ->fileName160())
                                     ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_96.mp3')) ])
                                                          ->fileName96())
                                     ->has(TrackMp3Factory::new([ 'md5' => md5_file($sibling_disk->path($track_token . '/track_demo.mp3')) ])
                                                          ->fileNameDemo())
                                     ->create([ 'track_token' => $track_token ]);
        
                Artisan::call('download');
            }
    
    推荐文章