times() 方法在 Mockery PHP 中不起作用

Vis*_*021 3 php phpunit unit-testing mockery

我是 PHP Mockery 框架的新手。我有一个模拟函数executePrepared($arg1, $arg2, arg3),我调用它两次,但似乎不起作用,并在 PHPUnit 命令行中给出以下错误:

\n\n
Configuration read from C:\\xampp\\htdocs\\DatabaseTesting\\phpunit.xml\n\n..\xe2\x86\x90[31;1mE\xe2\x86\x90[0m\n\nTime: 47 ms, Memory: 3.25Mb\n\nThere was 1 error:\n\n\n1) Test\\Database\\Table\\TableTest::testinsertMany\n Mockery\\Exception\\NoMatchingExpectationException: No matching handler found for\n Mockery_0_Database_PGC::executePrepared(array(0=>\'ClayPipe\',1=>2000,2=>2100,3=>1\n ,4=>\'2000-01-01\',5=>\'{"1":"1","2":6,"3":8,"4":10}\',), "insert_assets", "\\Databas\n e\\Model\\Asset"). Either the method was unexpected or its arguments matched no ex\n pected argument list for this method\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的测试功能如下:

\n\n
 public function testinsertMany() {\n      $this->PGCMock->shouldReceive(\'executePrepared\')->twice()->withArgs(array(\n[array(\'Clay Pipe\',2000,2100,1,\'2000-01-01\',\'{"1":"1","2":6,"3":8,"4":10}\'), \'insert_assets\', \'\\Database\\Model\\Asset\'],\n[array(\'Main Street\',1000,1100,0,\'2000-02-01\',\'{"1":"1","2":6,"3":8,"4":10}\'), \'insert_assets\', \'\\Database\\Model\\Asset\']))\n->andReturn($expectedResult1);\n\n$data1 = array(\'name\'=>\'Clay Pipe\',\n                    \'hist_cost\' => 2000,\n                    \'val_cost\' => 2100,\n                    \'val_method\' => 1,\n                    \'service_date\' => \'2000-01-01\',\n                    \'tags\' => \'{"1":"1","2":6,"3":8,"4":10}\'\n                    );\n\n    $data2 = array(\'name\'=>\'Main Street\',\n                    \'hist_cost\' => 1000,\n                    \'val_cost\' => 1100,\n                    \'val_method\' => 0,\n                    \'service_date\' => \'2000-02-01\',\n                    \'tags\' => \'{"1":"1","2":6,"3":8,"4":10}\'\n                    ); \n\n    $actualResult = $this->tableMock->insertMany(array($data1,$data2));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不明白这里出了什么问题。我使用传递的参数调用模拟函数两次()的语法是否错误?有人可以在这里指导我吗?

\n

gon*_*lez 5

twice()当相同的调用(包括参数)预计执行 2 次时应使用。看起来您想检查两个连续的调用,每个调用都有不同的参数。

如果是这样的话,这将起作用:

$this->PGCMock
    ->shouldReceive('executePrepared')
    ->once()
    ->ordered()
    ->withArgs([
        array('Clay Pipe',2000,2100,1,'2000-01-01','{"1":"1","2":6,"3":8,"4":10}'),
        'insert_assets', '\Database\Model\Asset'
     ])
     ->andReturn($result1);
$this->PGCMock
    ->shouldReceive('executePrepared')
    ->once()
    ->ordered()
    ->withArgs([
         array('Main Street',1000,1100,0,'2000-02-01','{"1":"1","2":6,"3":8,"4":10}'),
         'insert_assets', '\Database\Model\Asset'            
     ])
     ->andReturn($result2);
Run Code Online (Sandbox Code Playgroud)