Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php makePartial()返回Mockery\Exception\BadMethodCallException:此模拟对象上不存在方法_Php_Laravel_Unit Testing_Phpunit_Mockery - Fatal编程技术网

Php makePartial()返回Mockery\Exception\BadMethodCallException:此模拟对象上不存在方法

Php makePartial()返回Mockery\Exception\BadMethodCallException:此模拟对象上不存在方法,php,laravel,unit-testing,phpunit,mockery,Php,Laravel,Unit Testing,Phpunit,Mockery,我在试着测试我的分类课。我使用的是Mockery::mock()方法,带有'重载:'前缀和makePartial()方法 运行测试时,我出现以下错误: mockry\Exception\BadMethodCallException:Method App\Models\Category::getDynamicFieldsForDocument()在此模拟对象上不存在 这是我的密码: namespace App\Models; class Category extends DictionaryBas

我在试着测试我的分类课。我使用的是Mockery::mock()方法,带有'重载:'前缀和makePartial()方法

运行测试时,我出现以下错误:

mockry\Exception\BadMethodCallException:Method App\Models\Category::getDynamicFieldsForDocument()在此模拟对象上不存在

这是我的密码:

namespace App\Models;
class Category extends DictionaryBase{
    //some methods
    public function getDynamicFieldsForDocument()
    {
        $data = [];
        $parents = [];
        $allParents = $this->getParents($this->id, $parents);
        foreach ($allParents as $parentId) {

            $parent = Category::find($parentId);
            $fields = $parent->dynamicFields();
            foreach ($fields as $field) {
                $data[$field['name']] = $field;
            }
        }

        return $data;
    }
}

测试用例:

namespace Tests\Unit;

use App\Models\Category;
use Tests\TestCase;
class CategoryModelTest extends TestCase{
    //some methods
    /**
     * @runInSeparateProcess
     * @preserveGlobalState disabled
     */
    public function testGetDynamicFieldsForDocument()
    {
        $mockCategory = \Mockery::mock('overload:'.Category::class)->makePartial();
        $preparedDynamicFields = $this->prepareDynamicFields();
        $preparedCategories = $this->prepareCategories();
        $mockCategory->shouldReceive('find')->andReturn($preparedCategories[0], $preparedCategories[1], $preparedCategories[2]);
        $mockCategory->shouldReceive('getParents')->andReturn(['1a2b', '3c4d', '5e6f']);
        $mockCategory->shouldReceive('dynamicFields')->andReturn(null, $preparedDynamicFields[0], $preparedDynamicFields[1]);

        $response = $mockCategory->getDynamicFieldsForDocument();
        dd($response);
    }
}

我不知道为什么我仍然有错误。我认为当调用->makePartial()方法时,它应该只模拟由->shouldReceive()调用的方法


编辑:

现在,我正在创建不带:重载的模拟实例,并以这种方式模拟“find”方法:

    `$mockCategory->shouldReceive('find')->andReturn($preparedCategories[0], $preparedCategories[1], $preparedCategories[2]);`
我的find方法如下所示:

public static function find($id) {
        return $id ? self::list(config(static::IDENT.'.fields'), (new Filter('and'))->add('id', $id, '')->toArray(),[],1,1)[0] ?? null : null;
    }
这是我的错误:

错误:App\Exceptions\ApiException([string]的参数错误 $message[,long$code[,Throwable$previous=NULL]])

这是因为list方法调用了API,所以看起来这个方法是在没有mock的情况下调用的。
我知道我不能模拟静态方法,但在我之前使用:重载是可能的。现在怎么了

删除
:重载
,只需将模拟定义为:

$mockCategory = \Mockery::mock(Category::class)->makePartial()
示例

型号:

namespace App\Models;

class Foobar extends BaseModel
{
  public function foonction()
  {   
      Foobar::find();                                                                                                                                                                                          
      return '1';
  }   
}
测试:

名称空间测试

use Evalua\Heva\Models\Foobar;

class FoobarTest extends TestCase 
{
  public function testFoobar()
  {   
    $fooMock = \Mockery::mock('overload:'.Foobar::class)->makePartial();
    $fooMock->shouldReceive('find')->once();
    $fooMock->foonction();
  }   
}
在以下情况下失败:

Mockery\Exception\BadMethodCallException: Method Evalua\Heva\Models\Foobar::foonction() does not exist on this mock object
没有
:过载
测试通过

解释应该是:

在类(当前未加载)的有效名称前面加上“重载:”将生成别名mock(与“别名:”)但创建的该类的新实例将导入在原始mock($mock)上设置的任何期望。原始模拟从未被验证,因为它被用作新实例的预期存储。为此,我们使用术语“实例模拟”


可以发布类别模型和CategoryModelTest类的名称空间吗?还要检查测试文件上的
use
声明。我更新了我的帖子,你现在可以看到了。非常感谢!这是有帮助的,但我仍然有一个问题。我编辑了我的帖子。