PHPUnit не может имитировать класс

У меня проблема, из-за которой PHPUnit не может имитировать мой простой класс:

class.php

<?php
    class SUT {
    function doThing() {
        $db = new DB();
        return $db->query();
    }
}

class DB {
    function query() {
        return "failed";
    }
}
?>

test.php

<?php
use PHPUnit\Framework\TestCase;
require 'API/class.php';

class SampleTest extends TestCase {

    public function testTest() {
        $db = $this->createMock(DB::class);
        $db->method('query')
            ->willReturn("win");

        $sut = new SUT();
        $result = $sut->doThing();
        $this->assertEquals("win", $result);
    }

}

Выход:

PHPUnit 5.7.21 by Sebastian Bergmann and contributors.
Runtime:       PHP 7.1.16
Configuration: ~/API_tests/config.xml

F...............                                                  16 / 16 (100%)

Time: 604 ms, Memory: 10.00MB
There was 1 failure:

1) SampleTest::testTest
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'win'
+'failed'

~/API_tests/TestTest.php:14

Мне здесь не хватает чего-то базового? Требуется ли передать фиктивный объект ТРИ?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
146
1

Ответы 1

Это связано с тем, что вы создаете экземпляр класса DB непосредственно в методе doNothing. Это означает, что вы не используете созданный вами макет. Вы можете использовать внедрение зависимостей для достижения ожидаемого результата. Просто передайте экземпляр БД в SUT::__constructor() в качестве зависимости, и он будет работать.

class.php

class SUT
{
    /** @var DB */
    private $db;

    public function __construct(DB $db) {
        $this->db = $db;
    }

    function doThing()
    {
        return $this->db->query();
    }
}

class DB
{
    function query()
    {
        return "failed";
    }
}

test.php

<?php

use PHPUnit\Framework\TestCase;

require 'API/class.php';

class SampleTest extends TestCase
{

    public function testTest()
    {
        $db = $this->createMock(DB::class);
        $db->method('query')
            ->willReturn("win");

        $sut = new SUT($db);
        $result = $sut->doThing();
        $this->assertEquals("win", $result);
    }

}

Другие вопросы по теме