public function reportsToBeRun()
{
$reports = $this->repository->getReportsToBeRun();
foreach ($reports as $report) {
$report->setUpdated(new \DateTime());
}
return $reports;
}
我正在学习新工作中的测试驱动开发,我正在为如何测试上述示例而苦苦挣扎。我调用了一个使用 getResults()
并返回实体对象数组的存储库。我可以很好地模拟存储库,但我不知道我最好在这里返回什么。我可以模拟实体并返回它们,但是 setUpdated
将不会执行任何操作。我显然可以模拟 setUpdated
,但我不知道如何让它更新模拟的一个或多个实体。
我的第二个问题是我正在编写的测试并没有真正测试任何东西。正在模拟存储库调用, setter 也是如此。然后我只是返回我 mock 的任何东西。对于这样的功能,您会推荐做什么。
最佳答案
我不会 mock 这些实体,因为它们是普通的旧 PHP 对象,不会访问外部资源。
最好模拟存储库并让它返回实体集合:
class MyTest extends \PHPUnit_Framework_TestCase
{
private $service;
protected function setUp()
{
parent::setUp();
$this->service = new ReportService($this->createRepositoryMock());
}
protected function tearDown()
{
$this->service = null;
parent::tearDown();
}
public function testReportsToBeRun()
{
$reports = $this->service->reportsToBeRun();
$now = new \DateTime();
foreach ($reports as $report) {
$this->assertInstanceOf(Report::class, $report);
$this->assertTrue($report->getUpdated() <= $now);
}
}
private function createRepositoryMock()
{
$mock = \Mockery::mock(ReportRepository::class);
$reports = [
$this->createReport(1),
$this->createReport(2),
$this->createReport(3),
];
$mock->shouldReceive('getReportsToBeRun')->andReturn($reports);
}
private function createReport($id)
{
$report = new Report();
$report->setId($id);
return $report;
}
}
ReportService
是包含reportsToBerun
方法的服务。Report
是您的实体类。ReportRepository
是模拟的存储库类。
关于php - 使用 PHPUnit 和 Mockery 模拟 Symfony 实体进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982836/