1

我正在做我的实体的测试单元:

namespace PathtomyBundle\Tests;

require_once dirname(__DIR__).'/../../../app/AppKernel.php';

use Doctrine\ORM\Tools\SchemaTool;

abstract class TestCase extends \PHPUnit_Framework_TestCase
{
/**
 * @var Symfony\Component\HttpKernel\AppKernel
 */
protected $kernel;

/**
 * @var Doctrine\ORM\EntityManager
 */
protected $entityManager;

/**
 * @var Symfony\Component\DependencyInjection\Container
 */
protected $container;

public function setUp()
{
    // Boot the AppKernel in the test environment and with the debug.
    $this->kernel = new \AppKernel('test', true);
    $this->kernel->boot();

    // Store the container and the entity manager in test case properties
    $this->container = $this->kernel->getContainer();
    $this->entityManager = $this->container->get('doctrine')->getEntityManager();

    // Build the schema for sqlite
    //$this->generateSchema();

    parent::setUp();
}

public function tearDown()
{
    // Shutdown the kernel.
    $this->kernel->shutdown();

    parent::tearDown();
}

protected function generateSchema()
{
    // Get the metadatas of the application to create the schema.
    $metadatas = $this->getMetadatas();

    if ( ! empty($metadatas)) {
        // Create SchemaTool
        $tool = new SchemaTool($this->entityManager);
        $tool->createSchema($metadatas);
    } else {
        throw new Doctrine\DBAL\Schema\SchemaException('No Metadata Classes to process.');
    }
}

/**
 * Overwrite this method to get specific metadatas.
 *
 * @return Array
 */
protected function getMetadatas()
{
    return $this->entityManager->getMetadataFactory()->getAllMetadata();
}
}

并且:

 namespace pathtomybundle\Tests\Entity;
 use pathtomybundle\Tests\TestCase;
 use pathtomybundle\Entity\Calendars;

 require_once dirname(__DIR__).'/TestCase.php';

 class CalendarsDbTest extends TestCase
 {

protected $Calendars;

    public function setUp()
        {
            parent::setUp();

            $this->Calendars = new Calendars();
        }


    public function testGenerateCalendars()
    {

        $this->Calendars->setBeginDate(new \DateTime('now'));
        $this->Calendars->setDescription('Description');
        $this->Calendars->setEndDate(new \DateTime('now'));
        $this->Calendars->setType('sur titre');

        // Save the ExCalendars
        $this->entityManager->persist($this->Calendars);
        $this->entityManager->flush();



    }

       public function testUser(){

     $this->assertEquals('Description', $this->Calendars->getDescription() );

    }

所以我的问题是:

  • 为什么会引发此错误“断言 null 匹配预期失败”?

  • 为什么getDescription()退货NULL

  • 如何测试两个具有一对多关系的表,例如我的表日历与数据库中的另一个表?

编辑

对于第三个问题:

例如,我有两个表作业和具有多对一关系的日历,所以我将在日历表中有一个 Job_Id 字段,所以我将如何使用外键“job_id”进行测试单元

在日历实体中:

 /**
 * @var Job
 *
 * @ORM\ManyToOne(targetEntity="Job")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="job_id", referencedColumnName="job_id")
 * })
 */
private $jobId;

编辑-2-

当我运行我的 phpunit 测试“phpunit -c app”来测试 setters 函数并保存在数据库中时,所以我每次测试都有一个插入数据库的新数据,我的问题是可以做很多测试,但我将数据插入数据库只是一次,因为实际上我必须在每次测试时从数据库中删除数据。

2 - 另一个问题:创建一个database_test我使用“$this->generateSchema();”所以在第一次创建数据库并且当测试再次调用“TestCase”类(上面的代码)时,他试图创建再次数据库测试,然后我必须在第一次之后删除该行,这并不好,那么当我第一次运行我的测试时,我能做些什么来只运行一次这个行?

编辑-3

    /**
 * @var Job
 *
 * @ORM\ManyToOne(targetEntity="Job")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="job_id", referencedColumnName="id")
 * })
 */
private $job;

这是正常的?

4

1 回答 1

1
  1. 测试用例中的每个测试都会创建自己的 CalendarsDbTest 对象。所以,事实上, $this->Calendar 在每个测试中都是不同的对象(如果你想在测试之间共享它,你需要在 setUp 方法中创建它)

  2. 与上面相同(有 null 因为您从不使用 $this->Calendars 调用 setDescription - 它与第一次测试中的对象不同)

  3. 我不确定你到底是什么意思。你能更精确地展示你的意思吗(例如你想要测试的方法)?

编辑:

答案是:你不测试它。为什么?因为单元测试是单元测试 - 你应该在这里只测试你的实体。坚持,保持关系等是教义的责任,应该在那里进行测试——你不用担心。

您唯一应该测试的是 $jobId 属性的 setter/getter(顺便说一句。它应该是“$job”而不是“$jobId”,因为它是 Job 类的对象 - 不是整数),例如:

class CalendarTest extends \PHPUnit_Framework_TestCase
{
     (...)

     public function testSetGetJob()
     {
         $job = new Job();
         $job->setSomeProperty('someValue');  

         $expectedJob = clone $job; // you clone this because in setter you pass object by reference  

         $calendar = new Calendar();
         $calendar->setJob($job);

         $this->assertEquals($expectedJob, $calendar->getJob());
     }

     (...)
}
于 2012-09-04T13:32:18.440 回答