makePartial () возвращает Mockery \ Exception \ BadMethodCallException: метод не существует для этого фиктивного объекта - PullRequest
2 голосов
/ 22 марта 2019

Я пытаюсь проверить свой класс категории.Я использую метод Mockery :: mock () с префиксом «overload:» и методом makePartial ().

При запуске теста у меня появляется эта ошибка:

Mockery\Exception\BadMethodCallException : Method App\Models\Category::getDynamicFieldsForDocument() does not exist on this mock object

Вот мой код:

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;
    }
}

TestCase:

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 ()


EDIT:

Теперь я создаю ложный экземплярбез: перегрузки и насмешливого метода 'find' следующим образом:

    `$mockCategory->shouldReceive('find')->andReturn($preparedCategories[0], $preparedCategories[1], $preparedCategories[2]);`

Мой метод поиска выглядит так:

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]]])

Это потому, что API вызова метода спискатак что, похоже, этот метод вызывается без макета.Я знаю, что не могу издеваться над статическим методом, но раньше, когда я использовал: перегрузка была возможной.Что сейчас?

1 Ответ

0 голосов
/ 22 марта 2019

Удалить :overload и просто определить макет как:

$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

Без :overload теста на прохождение.

Объяснение должно быть в зависимости от того, что написано в документации по перегрузке :

Префикс действительного имени класса (который в данный момент НЕ загружен) с «overload:» сгенерирует псевдоним псевдонима (как с «alias:») за исключением того, что созданные новые экземпляры этого класса будут импортировать любые ожидания, установленные на источник mock ($ mock). Макет источника никогда не проверяется, поскольку он использует хранилище ожиданий для новых экземпляров. Для этого мы используем термин «экземпляр макета»

...