Метод Bar в классе Foo регистрирует сообщение с помощью метода отладки.Как написать тест-код для метода Bar - PullRequest
1 голос
/ 06 мая 2019

В моем классе Foo есть метод Bar, который при вызове записывает отладочное сообщение.Класс Foo получает метод регистрации \ Psr \ Log \ LoggerInterface $ в своем методе __contruct.Я создал метод testBar в своем классе FooTest, но метод отладки в моем методе Bar дает следующую ошибку

Неустранимая ошибка PHP: класс Mock_LoggerInterface_a49cf619 содержит 8 абстрактных> методов и поэтому должен быть объявлен абстрактным или реализоватьостальные> методы (Psr \ Log \ LoggerInterface :: emergency, Psr \ Log> \ LoggerInterface :: alert, Psr \ Log \ LoggerInterface :: критический, ...) в / var / www / html / myproject / vendor / phpunit/phpunit-mock-objects>/src/Generator.php(264): код eval () в строке 1

Мой код класса указан ниже

use Psr\Log\LoggerInterface;

class Foo {


    private $logger;
    private $myclassObject;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
    public function Bar ()
    {
      // some code
      $logger->debug ('debug message')

    }
}

Мой тестовый класс, приведенный ниже

use PHPUnit\Framework\TestCase;

class FooTest extends TestCase
{

    private $logger;
    public function setUp()
    {
        $this->logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')
            ->setMethods(null)
            ->getMock();

        $this->logger->expects($this->any())
            ->method('debug')
            ->willReturn('Message Logged');
    }

    $this->myclassObject = $this->getMockBuilder('MyVendor\MyModule\Model\Foo')
    ->setMethods(['__construct'])        
    ->setConstructorArgs(['$logger'])
    ->disableOriginalConstructor()
    ->getMock();

    public function testBar()
    {

        $this->assertEquals($expected_result,$this->myclassObject->Bar());
    }
}

Я ожидаю увидеть успешное модульное тестирование с записью отлаженного метода отладки «Message Logged»

1 Ответ

1 голос
/ 07 мая 2019

Я игнорирую синтаксическую проблему с определением $this->myclassObject на уровне класса, потому что я полагаю, что это опечатка, которую вы создали при создании этого вопроса.

Я думаю , что у вас есть двапроблемы:

  • Вы переопределяете способность PHPUnit имитировать абстрактные / интерфейсные методы класса / интерфейса, указав null в setMethods в LoggerInterface, который говорит, что он ничего не должен высмеивать
  • YouВы оба отключаете конструктор Foo и , предоставляя аргументы конструктора (в кавычках как скалярное значение имени переменной)

Вы также ссылаетесь на $logger, который не существует.

Я бы также предположил, что в вашем примере вам вообще не нужно частично издеваться над Foo, так как на данный момент вы не высмеиваете ни одну из его функциональных возможностей.Вы можете просто позвонить new Foo($this->logger).Тем не менее, я предполагаю, что ваш пример урезан, и вам do необходимо частично издеваться над другими частями класса, поэтому пока оставим это.

Попробуйте это:

class FooTest extends TestCase
{
    private $logger;
    private $myclassObject;

    protected function setUp()
    {
        $this->logger = $this->createMock('\Psr\Log\LoggerInterface');

        $this->logger->expects($this->any())
            ->method('debug')
            ->willReturn('Message Logged');

        $this->myclassObject = $this->getMockBuilder('\MyVendor\MyModule\Model\Foo')
            ->setConstructorArgs([$this->logger])
            ->getMock();
    }

    public function testBar()
    {
        $this->assertEquals($expected_result, $this->myclassObject->Bar());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...