PHPUnit тестирует ячейку, не работающую с set, но с возвращением? - PullRequest
0 голосов
/ 31 августа 2018

CakePHP Версия: 3.6.6
PHPUnit: 6.5.8

// ЧТО ПРОИСХОДИТ

Мой тест ролевых ячеек возвращает ноль, когда он должен вернуть значение. Это приводит к тому, что мой тест не пройден, поскольку значение null не соответствует ожидаемому значению.

// ROLE CELL

<?php
namespace App\View\Cell;

use Cake\View\Cell;
use Cake\ORM\TableRegistry;

/**
 * Role cell
 */
class RoleCell extends Cell
{

    /**
     * List of valid options that can be passed into this cell's constructor.
     *
     * @var array
     */
    protected $_validCellOptions = [];

    /**
     * Select the role for the page title on edit and view user.
     */
    public function roleSingular($id = null)
    {

        // Ensure the id is an int when negotiating with the db.
        if (!is_int($id)) {
            $this->set('role', 'CELL_ERR'); 
        }
        else {

            // Select the users role to display on the edit and view pages.
            $Users = TableRegistry::getTableLocator()->get('Users');   
            $query = $Users->find('cellUsersRole', [
                'id' => $id,
            ]);            

            // Check query not empty - Should have one result
            if ($query->isEmpty()) {
                $this->set('role', 'CELL_ERR');
            }
            else {          

                $role = '';
                foreach ($query as $row):                
                    $role = $row->role;
                endforeach;

                // Send the role to the edit and view for the page titles.
                $this->set('role', $role);

                // NOTE: Change above to return $role and the test works. 
            }
        }        
    } 
}

// ПРОВЕРКА РОЛЬНЫХ КЛЕТОК

<?php
namespace App\Test\TestCase\View\Cell;

use App\View\Cell\RoleCell;
use Cake\TestSuite\TestCase;

/**
 * App\View\Cell\RoleCell Test Case
 */
class RoleCellTest extends TestCase
{

    /**
     * Request mock
     *
     * @var \Cake\Http\ServerRequest|\PHPUnit_Framework_MockObject_MockObject
     */
    public $request;

    /**
     * Response mock
     *
     * @var \Cake\Http\Response|\PHPUnit_Framework_MockObject_MockObject
     */
    public $response;

    /**
     * Test subject
     *
     * @var \App\View\Cell\RoleCell
     */
    public $RoleCell;

    /**
     * Fixtures.
     *
     * @var array
     */
    public $fixtures = [
        'app.users'
    ];

    /**
     * setUp method
     *
     * @return void
     */
    public function setUp()
    {
        parent::setUp();
        $this->request = $this->getMockBuilder('Cake\Http\ServerRequest')->getMock();
        $this->response = $this->getMockBuilder('Cake\Http\Response')->getMock();
        $this->RoleCell = new RoleCell($this->request, $this->response);
    }

    /**
     * tearDown method
     *
     * @return void
     */
    public function tearDown()
    {
        unset($this->RoleCell);

        parent::tearDown();
    }

    /**
     * Test roleSingular method
     *
     * @return void
     */
    public function testRoleSingular()
    {
        // Superuser.
        $result = $this->RoleCell->roleSingular(1400);
        $this->assertEquals('Superuser', $result);       
   }
}

// РЕЗУЛЬТАТ ИСПЫТАНИЯ

Не удалось подтвердить, что нулевое значение соответствует ожидаемому суперпользователю.

// ВОПРОС

Почему возвращается ноль?

// ОТЛАДКА

Этот тест очень похож на тесты компонентов, которые работают нормально. Единственное существенное различие, которое я могу выявить, состоит в том, что компонент возвращает значение, а ячейка устанавливает его.

IE:
В компоненте мы используем: return $ variable

И в ячейке мы используем: $ this-> set ('role', $ role);

На этом основании я изменил $ this-> set ('role', $ role); на return $ role в своей ролевой ячейке, и тест сработал.

// ССЫЛКИ

https://book.cakephp.org/3.0/en/views/cells.html#implementing-the-cell

// ЗАКЛЮЧЕНИЕ

Из того, что я могу сказать, тест ячейки не будет работать, если я не верну значение? Unyet, как описано в Кулинарной книге в ячейке, мы используем $ this-> set для отправки значения в представление.

Надеюсь, кто-нибудь поможет мне понять, что происходит?

Спасибо, З.

...