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 для отправки значения в представление.
Надеюсь, кто-нибудь поможет мне понять, что происходит?
Спасибо, З.