Издевательство / PhpUnit: тест пройден успешно, но неверен - PullRequest
0 голосов
/ 24 января 2019

У меня есть Domoticz класс, который читает внешний API.

class Domoticz extends HeaterService implements DomoticControllerInterface {

public function getFromApiCurrentHeaterStatus($current_heater)
    {
        $current_heater = json_decode($current_heater);

        if (!isset($current_heater->result)) {
            throw new \Exception('There is a problem retrieving heater status');
        }

        $heater = array();

        foreach ($current_heater->result as $result) {

            $heater['idx'] = (int)$result->idx;
            $heater['status'] = $result->Status;

        }

        return $heater;
    }
}

Метод getFromApiCurrentHeaterStatus возвращает массив.

Это мой тест

    class DomoticzTest extends TestCase
{

/**
 * This is a copy of real json got from an API call
 */
private $heater_answer = '{"result":{"2":{"Status":"Off","idx":"17"}}}';

/**
 * Test that from an answer as $heater_answer, we can get an array with idx and status
 *
 */
public function testThatWeCanGetAnArrayFromHeaterAnswer()
{
    $right_heater_array = array('idx' => 17, 'status' => 'Off');
    $right_array_we_want = $right_heater_array; // we need to get an array
    $wrong_heater_array = array('idx' => 11, 'status' => 'On');
    $wrong_array_we_dont_want = $wrong_heater_array;

    $mock = $this->getMockBuilder('\App\Libs\Domoticz')
        ->disableOriginalConstructor()
        ->getMock();

    $mock
        ->expects($this->once())
        ->method('getFromApiCurrentHeaterStatus')
        ->with($this->heater_answer)
        ->willReturn($right_array_we_want);

    $heater = $mock->getFromApiCurrentHeaterStatus($this->heater_answer);
    $this->assertEquals($right_array_we_want,$heater);
}

Тест пройден.Фактически, с помощью «реального» вызова API ($this->heater_answer) мы получаем массив

$heater['idx'] = 17;
$heater['status'] = 'Off';

Теперь я попытался изменить свойство heater_answer, изменив idx с 17 на 2, дляНапример, или статус, в каждом случае тест проходит.

Другими словами: реальный метод не выполняется?Как заставить тест выполнить действительно настоящий метод?

1 Ответ

0 голосов
/ 24 января 2019

Почему ты над этим издеваешься? Вы не делаете фактический вызов API в этом методе.

Поскольку вы проверяете, декодирует ли ваш метод фактический нагреватель ответ на правильный формат, ваш тест должен выглядеть следующим образом:

private $heater_answer = '{"result":{"2":{"Status":"Off","idx":"17"}}}';

public function testThatWeCanGetAnArrayFromHeaterAnswer()
{
    $mock = $this->getMockBuilder('\App\Libs\Domoticz')
        ->setMethodsExcept(['getFromApiCurrentHeaterStatus'])
        ->disableOriginalConstructor()
        ->getMock();

    $response = $mock->getFromApiCurrentHeaterStatus($this->heater_answer); 

    $this->assertEquals([
        'idx' => 17, 
        'status' => 'Off'
    ], $response);
}

При добавлении setMethodsExcept() методы, определенные в этом массиве, не будут заменены на двойной тест. Тогда вы действительно можете проверить это.

...