23/10/2017 - PHPUNIT
PHPUnit'in test double özelliğini kullanarak yaptığımız testlerde, test edilen servisleri kullanıyormuş gibi yaparız. Test double özelliğini kullanmayarak yaptığımız testlerde ise, test edilen servisleri gerçekten kullanırız. Aşağıdaki örnekteki test double kısmı pek bir anlam ifade etmiyor çünkü eğer test edilen class'ı bozarsanız, testGetUsersWithMock()
maalesef başarıyla sonuçlanacaktır. Burada size sadece her iki seçeneğin nasıl kullanıcağını gösteriyorum.
namespace Application\Util;
class ParameterUtil
{
const MIN_PAGE = 0;
const MAX_LIMIT = 5;
const MIN_LIMIT = 1;
public function getPage($page)
{
if (!$page || $page < 1) {
$page = self::MIN_PAGE;
}
return (int) $page;
}
public function getLimit($limit)
{
if (!$limit || $limit < 1) {
$limit = self::MIN_LIMIT;
} elseif ($limit > self::MAX_LIMIT) {
$limit = self::MAX_LIMIT;
}
return (int) $limit;
}
}
namespace Application\Service;
use Application\Util\ParameterUtil;
class UserService
{
const USERS = [
'User 1',
'User 2',
'User 3',
'User 4',
'User 5',
'User 6',
'User 7',
'User 8',
'User 9',
'User 10',
];
private $parameterUtil;
public function __construct(ParameterUtil $parameterUtil)
{
$this->parameterUtil = $parameterUtil;
}
public function get($page = null, $limit = null)
{
$page = $this->parameterUtil->getPage($page);
$limit = $this->parameterUtil->getLimit($limit);
return array_slice(self::USERS, $page, $limit);
}
}
namespace tests\Application\Service;
use Application\Service\UserService;
use Application\Util\ParameterUtil;
use PHPUnit\Framework\TestCase;
class UserServiceTest extends TestCase
{
/** @var ParameterUtil */
private $parameterUtil;
protected function setUp()
{
$this->parameterUtil = new ParameterUtil();
}
protected function tearDown()
{
$this->parameterUtil = null;
}
/**
* @dataProvider getUsersDataProvider
*/
public function testGetUsers($page, $limit, $expected)
{
$userService = new UserService($this->parameterUtil);
$result = $userService->get($page, $limit);
$this->assertEquals($expected, $result);
}
/**
* @dataProvider getUsersDataProvider
*/
public function testGetUsersWithMock($page, $limit, $expected)
{
$userService = $this->getMockBuilder(UserService::class)
->setConstructorArgs([$this->parameterUtil])
->getMock();
$userService->expects($this->any())
->method('get')
->will($this->returnValue($expected));
$this->assertEquals($expected, $userService->get($page, $limit));
}
public function getUsersDataProvider()
{
return [
[null, null, ['User 1']],
[1, null, ['User 2']],
[null, 1, ['User 1']],
[1, 1, ['User 2']],
[2, 1, ['User 3']],
[2, 2, ['User 3', 'User 4']],
];
}
}
$ vendor/bin/phpunit
PHPUnit 5.7.22 by Sebastian Bergmann and contributors.
............ 12 / 12 (100%)
Time: 23 ms, Memory: 3.75MB
OK (12 tests, 12 assertions)