如何模拟Schema :: getColumnListing't_schedule';在laravel的phpunit中

问题描述

我想在PHPUnit中测试我的CSV导入方法。 我的PHPUnit测试控制器,我想测试导入的CSV文件并将数据插入数据库。 在TestDataCSV.PHP中,我创建了必需的CSV文件和数组。

<?PHP

namespace Tests\Unit;

use Tests\TestCase;
use \Mockery;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

include "TestDataCSV.PHP";

class scheduleCSVImportTest extends TestCase
{
    //use RefreshDatabase,WithFaker;
    /**
     * Allocation unit test
     *
     * @dataProvider csvImportDataProvider
     */
    public function testconvert($scheduleCSVData,$scheduleTEXTData,$getColumnListingData,$expectedResultArr)
    {
        $mockMasterData = Mockery::mock('App\Http\Controllers\CsvController')->makePartial();        

        Schema::shouldReceive('getColumnListing')
                 ->with('t_schedule')
                 ->andReturn($getColumnListingData);       
                
        $actualResult = $mockMasterData->convert($scheduleCSVData,'schedule');       
        
        $this->assertEquals($expectedResultArr,$actualResult);        
    }
    
    public function csvImportDataProvider()
    {
        return data();
    }
}

我的csvController代码是:

    public function convert($fp,$targetFile,$target_table)
    {
     ...........
     .........
     if ($target_table=='schedule') {
            $column_names = Schema::getColumnListing('t_schedule');
        }
    ...........
return [
            'message' => $message.
            "対象テーブル:[ $target_table_name ]<br>".
            "登録件数:[ $insert_count ]<br>".
            "更新件数:[ $update_count ]<br>",'target_table' => $target_table,];
    }

当我打印$ column_names时,它显示一个空数组。

解决方法

您可以尝试使用Aliasing模拟静态方法:

别名模拟使用给stdClass的给定类名创建类别名 并且通常用于启用公共静态方法的模拟。 。在新的模拟对象上设置的期望涉及静态 方法将用于对该类的所有静态调用。

$mock = \Mockery::mock('alias:MyClass');