kleninmaxim's avatar

PhpUnit test Method was expected to be called 1 times, actually called 0 times.

I have class that extend Memcached:

<?php

namespace Src\Databases;

class Memcached extends \Memcached
{
    private string $prefix = 'prefix';

    public function __construct(array $services = ['127.0.0.1'])
    {
        parent::__construct();

        foreach ($services as $service)
            $this->addServer($service, 11211);
    }

    public function setData(string $key, mixed $data): void
    {
        $this->set($this->prefix . $key, [
            'data' => $data,
            'timestamp' => microtime(true)
        ]);
    }
}

My Unit Test:

<?php

namespace Tests\Databases;

use PHPUnit\Framework\TestCase;

class Memcached extends TestCase
{
    /** @test */
    public function test()
    {
        $data = ['one', 'two', 'three'];
        $now = microtime(true);

        $memcached = $this->createMock(\Src\Databases\Memcached::class);

        $memcached->expects($this->once())
            ->method('set')
            ->with('test', ['data' => $data, 'timestamp' => $now]);

        $memcached->setData('test', $data);
    }
}

But it fails:

Expectation failed for method name is "set" when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

How can I write test for proof such block?

0 likes
3 replies
kleninmaxim's avatar

@Sinnbeck Yeah, I try it now, but I get another problem:

        $memcached = \Mockery::mock(\Src\Databases\Memcached::class)->makePartial();
        $memcached->shouldReceive('set')->with('test', ['data' => $data, 'timestamp' => $now])->andReturn(true);
        $memcached->setData('test', $data);

And get Error: Error : Memcached constructor was not called

And can not to understand how to use this doc

Please or to participate in this conversation.