【发布时间】:2017-06-07 03:06:26
【问题描述】:
我有这两个课程:
AbstractTaskDispatcher
<?php
declare(strict_types=1);
namespace MyExample;
abstract class AbstractTaskDispatcher
{
public final function getResult(Task $task) : Result
{
if($worker = $this->getWorker($task))
return $worker->getResult();
else
return Result::getUnprocessableTaskResult();
}
abstract protected function getWorker(Task $task) : Worker;
}
?>
结果
<?php
declare(strict_types=1);
namespace MyExample;
class Result
{
private $code;
public function __construct(int $code = 0)
{
$this->code = $code;
}
public static function getUnprocessableTaskResult() : Result
{
return new Result(1000);
}
public function getCode() : int
{
return $this->code;
}
}
?>
我想用 PHPUnit 编写一个单元测试来确保 AbstractTaskDispatcher::getResult() 在没有找到合适的 Worker 来处理任务时返回 Result::getUnprocessableTaskResult()。
我不想这样做:
- 安排:$expectedResult = Result::getUnprocessableTaskResult();
- 动作:$result = $dispatcherStub->getResult(New Task());
- 断言:assertEquals($result, $expectedResult);
因为它依赖于 Result 类的实现,不会是单元测试。
我试着做点什么:
<?php
use PHPUnit\Framework\TestCase;
use MyExample as ex;
class AbstractDispatcherTest extends TestCase
{
public function test_getResultSouldReturnUnprocessableTaskResultIfNoWorkerFound()
{
$dispatcher = $this->getMockForAbstractClass(ex\AbstractDispatcher::class);
$arbitraryCode = 6666;
$expectedResult = new ex\Result($arbitraryCode);
$resultClass = $this->getMockClass('Result', ['getUnprocessableTaskResult']);
$resultClass::staticExpects($this->any())
->method('getUnprocessableTaskResult')
->will($this->returnValue($expectedResult));
$result = $dispatcher->getResult(new ex\Task([]));
$this->assertEquals($expectedResult, $result);
}
}
?>
但 staticExpects() 方法已被弃用,并且在当前 PHPUnit 版本中不再存在。
我该如何编写这个测试?
【问题讨论】:
-
嗨@berty,只有一个问题:如何返回
false方法getWorker?严格的类型定义不能接受你返回与Worker对象实例不同的东西 -
从设计的角度来看,您为什么选择使用静态方法进行返回?
AbstractTaskDispatcher没有理由不能只返回一个新的Result实例本身,因为它知道 Result 类的开头。 -
嗨@Matteo,我在编写它时考虑到了 PHP 7.1 和可为空的返回类型,即使我目前使用的是 PHP 7.0
-
@JohnJoseph,我不想在不同的类/方法中多次使用此特定结果的内容(在我的示例中为代码 = 1000)“硬编码”。跨度>
-
@JohnJoseph 这种做法被称为“命名构造器模式”
标签: php unit-testing phpunit static-methods php-7