фиктивная не классовая функция в тесте phpunit - PullRequest
0 голосов
/ 03 мая 2020

У меня есть необработанный код PHP для каждого l oop. Я использую php 7.2 и PHPUnit 8.

вот имя файла app.php, а код приведен ниже: Здесь у меня есть еще один вызов CalculatorAPI(), который требует вызова API - тоже нужен макет.

$list = file_get_contents('input.txt');
$inputData = explode("\n", trim($list));

function main ( $inputData ) {
   foreach ($inputData as $row) {
    if (empty($row)) break;

    //explode row
    $p = explode(",", $row);

    // retrieve bin, amount and currency
    $p2 = explode(':', $p[0]);
    $currency = trim($p2[1], '"}');

    // Class which needs a mock up because it requires API call
    $calApi = new CalculatorAPI(); 
    $result =$calApi->getFinalResult($currency);

    echo $result;
    print "\n";
   }
}

main( $inputData );

Обратите внимание: в input.txt У меня есть {"currency":"EUR"}..., чтобы получить список валют.

Теперь мне нужно написать код для PHPUnit test :: вот тестовый файл

<?php

require_once __DIR__."/../app.php";

use PHPUnit\Framework\TestCase;

class AppTest extends TestCase
{

    public function testApp() : void
    {
        $calAPI = $this->createStub(CalculatorAPI::class);
        $calAPI->method('getFinalResult')
            ->willReturn(1);

        $result = main($this->data, $calAPI);

        $this->assertEquals(1, $result);
    }

}

, когда я запускаю его, он запускает файл. Как мне написать код для raw PHP? Кроме того, мне нужно запустить тест в автономном режиме, хотя для этого требуется вызов API.

1 Ответ

0 голосов
/ 03 мая 2020

Вы должны заключить свой код foreach в функцию, скажем, myForeach, чтобы предотвратить его выполнение во время require_once __DIR__."/../app.php";.

Затем из вашего теста вы должны запустить функцию myForeach. В вашем тесте вы должны поймать вывод вашей myForeach функции. После того, как вы поймаете его, вы должны сравнить его с ожидаемым значением, которое вы хотите увидеть в случае успешного выполнения функции.

Тогда ваш AppTest::test() может выглядеть следующим образом:

$actual = myForeach();
$this->assertEquals('my expected foreach return value', $actual);

Это только для случая, когда myForeach явно возвращает значение (а в вашем случае это не так, умышленно или нет). Теперь, если вы ожидаете, что myForeach выведет на консоль вместо явного возврата некоторого значения (что может быть в случае, если вы TDD например, утилита CLI), ваш тест будет выглядеть так:

// Wrap your `myForeach` function into something special
// to catch its console output made with `print`
ob_start();
myForeach();
$actual = ob_get_clean();

// Now you have all your output from the function in $actual variable
// and you can assert with PHPUnit if it contains the expected string
$this->assertStringContainsString('my expected foreach return value', $actual);

Некоторые ссылки: PHP буферизация вывода документы , доступен PHPUnit утверждения

...