Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

AspectMock ошибка Construct an instance from this class


(Dmitry) #1

Поставил AspectMock

Создаю класс

namespace updater;

class User {
    private $name;
    
    function setName($name)
    {
        $this->name = $name;
    }
    
    function getName()
    {
        return $this->name;
    }
    
    function save()
    {
        echo 'Save!!!!';
    }
}

и тест

use AspectMock\Test as test;
use updater\User;

class UserService {
    function createUserByName($name)
    {
        $user = new User;
        $user->setName($name);
        $user->save();
    }
}

class aspectMoskTest extends \PHPUnit_Framework_TestCase
{
    function testUserCreate()
    {
        $user = test::double('updater\User', ['save' => null]);
        $service = new UserService;
        $service->createUserByName('davert');
        $this->assertEquals('davert', $user->getName());
        $user->verifyInvoked('save');
    }
}

Содержимое _bootstrap.php

<?php

require_once \dirname(__DIR__).'/vendor/autoload.php';

$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
    'debug' => true,
    'includePaths' => [\dirname(__DIR__).'/updater']
]);

Добавлял

'appDir'    => \dirname(__DIR__),

Структура директории

updater
    User.php
tests
   _bootstrap.php
  тесты в поддиректориях
vendors
    пакеты Composer

Вроде все делаю по базовому примеру. Получаю ошибку

aspectMoskTest::testUserCreate
Exception: Called updater\User->getName, but this is a proxy for a class definition.
Probably you was trying to access instance method.
Construct an instance from this class

Что я делаю не так?


(Michael Bodnarchuk) #2

Не читаете текст ошибки и документацию :smile:

Этот код не создает инстанс класса. Этот вызов декларирует, что метод save в классе будет отключен.
$user это инстанс AspectMock\ClassProxy и содержит исключительно методы типа verifyInvoked.

Когда вы вызываете $user->getName AspectMock понятия не имеет какой инстанс этого класса вы имеете ввиду, а потому выбрасывает эту ошибку - это прокси-класс, а не обьект типа updater\User


(Dmitry) #3

Спасибо за ответ. Как раз документацию я и читал :blush: и она то и ввела меня в заблуждение

Хотя признаю читал не полностью :frowning: , хотел в начале получить рабочий пример, и лишь потом лезть в “дебри” интерфейса.

И так башка пухнет. Пересел на PHP недели 2,5 назад после больше чем 10 летнего перерыва.
Надо определяться с базовой системой тестирования. Пока использую PHPUnit, но нужны нормальные Mock-и, интеграционное и приемочное тестирование… Пришлось разбираться с Composer. Прочитал всю доку от корки до корки. А ведь еще кодить надо…:frowning:

Пример полностью взят из файла README.md документации. Второй и третий блоки кода. Я только класс User создал.