Невозможно протестировать метод, который ссылается на метод насмешки PHPUnit - PullRequest
0 голосов
/ 08 мая 2018

Я использую фиктивный PHPUnit для создания фиктивного теста для моего кода. Но когда я создаю фиктивный метод (A), который вызывается другим методом (B) в классе, метод B не возвращает то, что я хочу - он всегда возвращает ноль.

Мой класс:

public function isRecommended()
{
    return $this->getAverageScore() >= 3;
}

public function getAverageScore()
{
    // do something
}

Мой тест:

public function testIsRecommended_With5_ReturnsTrue()
{
    $game = $this->createMock(Game::class);
    $game->method('getAverageScore')->willReturn(5); //mocking return 5
    $this->assertTrue($game->isRecommended());
}

Ошибка:

1) Src\Tests\Unit\GameTest::testIsRecommended_With5_ReturnsTrue
Failed asserting that null is true.

composer.json

{
    "require": {
        "phpunit/phpunit": "^7.1",
        "phpunit/phpunit-mock-objects": "^6.1"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/",
            "Tests\\": "tests/"
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Нет причин издеваться над классом, который вы тестируете. Поддельный используется, чтобы избежать сложного, рискованного или дорогостоящего вызова функции из другого объекта или класса, для которого вы знаете ответ, и / или вы тестируете его в другом классе.

Для модульных тестов вы должны перевести приложение в состояние, в котором вы можете протестировать желаемый сценарий.

Итак, вы можете сделать что-то вроде

public function testIsRecommended_With5_ReturnsTrue()
{
    $game = new Game;
    $game->addScore(10);
    $game->addScore(0); //average score 5
    $this->assertTrue($game->isRecommended()); //5 > 3
}
...