У меня проблема, из-за которой 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
Мне здесь не хватает чего-то базового? Требуется ли передать фиктивный объект ТРИ?






Это связано с тем, что вы создаете экземпляр класса 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);
}
}