Как написать модульный тест для CakePHP: Model-> find () - PullRequest
0 голосов
/ 01 октября 2018

У меня есть метод, который использует модель-> find ().Как я понял, чтобы написать тест, я должен использовать макет.Я новичок в написании тестов.Можете ли вы сказать мне, какой способ поиска.

function findSomethingInDB($client_id, $expiredLag): array
{
    $date = date("Y-m-d H:i:s", time() - $expiredLag);
    $conditions = [
        "DB.expires >" => $date,
        'client_id' => $client_id,
        'state' => 0,
    ];

    $result = $this->find('all', [
        'recursive' => -1,
        'conditions' => $conditions,
    ]);
    return $result;
}

Здесь мой код в модульном тесте php.Я пытался написать сам, но поход не подходит.

public function testFindSomethingInDB()
{
    $client_id = '1';
    $expireLag = '0';

    $expected = [
        '0' => [
            'DB' => [
                'id' => '3068',
                'procedure_id' => '1',
                'client_id' => '1',
                'object' => 'test',
                'date' => '2034-02-09 22:05:37',
                'entity' => 'test',
                'freshness' => '-354923520',
                'expires' => '2022-11-12 00:13:37',
            ],
        ],
    ];

    $mysql = $this->getMockBuilder(ErrorK50::class)
                  ->getMock();
    $mysql->expects($this->any())
          ->method('findSomethingInDB')
          ->with($this->equalTo($client_id), $this->equalTo($expireLag))
          ->will($this->returnValue($expected));
    $errorK50 = new ErrorK50($mysql);
    $result = $errorK50->findSomethingInDB($client_id, $expireLag);

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

В проекте используется тест phpunit 6.5.9

1 Ответ

0 голосов
/ 03 октября 2018

В вашей реализации findSomethingInDB() я вижу, что вы вызываете функцию find() в том же классе - $this->find(...) - Я не уверен, почему вы вводите макет в его исходный класс.

Чтобы добиться того, что вам нужно сделать, нужно частично смоделировать ErrorK50.По сути, при создании макета вы указываете, какие функции будут контролироваться, а какие должны вести себя нормально, используя функцию setMethods(['array','of','functions']).

$errorK50PartialMock = $this->getMockBuilder(ErrorK50::class)
     ->setMethods(['find'])
     ->getMock();

$errorK50PartialMock->expects($this->once())
     ->method('find')
     ->willReturn($expected);

$result = $errorK50PartialMock->findErrorInDB($client_id, $expireLag);

$this->assertEquals($expected, $result);
...