单元测试Doctrine ODM

10

我开始编写 Doctrine 2 Mongo ODM 单元测试,但意识到我的代码中没有一个很好的策略来实现。我想运行测试并实际持久化对象,但是我希望我的测试数据可以轻松地在 tearDown 中删除。根据我所看到的注释,必须指定集合和数据库名称,不能被覆盖,因此我无法只创建一个测试数据库并稍后清除它。

有没有人有最佳实践或示例,他们认为最好的测试方式是什么?


有关如何测试Doctrine ODM持久化的模型的最佳实践指针将不胜感激。似乎并没有太多可供模仿的内容。 - Bryan M
1个回答

10

你不必持久化你的对象。更好的方式是使用模拟来检查你的对象是否被持久化。我给你举个例子。假设你有一个类:

class SomeSerivce
{
     private $dm;

     public function __construct(DocumentManager $dm)
     {
         $this->dm = $dm;
     }

     public function doSomeMagic($someDocument, $someValue)
     {
         $someDocument->setSomeValue($someValue);
         $this->dm->persist($someDocument);
         $this->dm->flush();
     }
 }

现在,您不需要检查文档是否真正持久化,因为这在Doctrine代码的某个地方进行了测试。 您可以假设persistflush方法正常工作。 您想要检查的是您的代码是否正确调用了这些方法。

因此,您的测试可能如下所示:

 (...)
 public function testDoSomeMagic()
 {
     $documment = new Document();

     // preapre expected object
     $expectedValue = 123;
     $expectedDocument = new Document();
     $expectedDocument->setValue($expectedValue);

     // prepare mock
     $dmMock = $this->getMockBuilder('DocumentManager')
         ->setMethods(array('persist', 'flush'))
         ->disableOriginalConstructor()
         ->getMock();
     $dmMock->expects($this->once())
         ->method('persist');
         ->with($this->equalTo($expectedDocument));
     $dmMock->expects($this->once())
         ->method('flush');

     // new we start testing with the mock
     $someService = new SomeService($dmMock);
     $someService->doSomeMagic($document, $expectedValue);
}

2
一旦开始添加queryBuilders,情况就会变得更加复杂。有什么建议吗? - Mike Graf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接