Unit testing $this->;assertEquals错误:无法断言null与预期匹配

Unit testing $this->;assertEquals错误:无法断言null与预期匹配,unit-testing,symfony,phpunit,Unit Testing,Symfony,Phpunit,我正在做实体的测试单元: 名称空间路径tomybundle\Tests; 需要_once dirname(uu DIR_uu)。'/../../../../app/AppKernel.php'; 使用条令\ORM\Tools\SchemaTool; 抽象类TestCase扩展\PHPUnit\u框架\u TestCase { /** *@var Symfony\Component\HttpKernel\AppKernel */ 受保护的$kernel; /** *@var-Doctrine\OR

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

名称空间路径tomybundle\Tests;
需要_once dirname(uu DIR_uu)。'/../../../../app/AppKernel.php';
使用条令\ORM\Tools\SchemaTool;
抽象类TestCase扩展\PHPUnit\u框架\u TestCase
{
/**
*@var Symfony\Component\HttpKernel\AppKernel
*/
受保护的$kernel;
/**
*@var-Doctrine\ORM\EntityManager
*/
受保护的$entityManager;
/**
*@var Symfony\Component\DependencyInjection\Container
*/
受保护的集装箱;
公共功能设置()
{
//在测试环境中引导AppKernel并使用调试。
$this->kernel=new\AppKernel('test',true);
$this->kernel->boot();
//将容器和实体管理器存储在测试用例属性中
$this->container=$this->kernel->getContainer();
$this->entityManager=$this->container->get('doctrine')->getEntityManager();
//为sqlite构建模式
//$this->generateSchema();
父::设置();
}
公共函数拆卸()
{
//关闭内核。
$this->kernel->shutdown();
父::拆卸();
}
受保护函数generateSchema()
{
//获取应用程序的元数据以创建模式。
$metadatas=$this->getMetadatas();
如果(!empty($metadatas)){
//创建模式
$tool=newschematool($this->entityManager);
$tool->createSchema($metadatas);
}否则{
抛出新的条令\DBAL\Schema\SchemaException('没有要处理的元数据类');
}
}
/**
*覆盖此方法以获取特定的元数据。
*
*@return数组
*/
受保护的函数getMetadatas()
{
返回$this->entityManager->getMetadataFactory()->getAllMetadata();
}
}
而且:

名称空间路径tomybundle\Tests\Entity;
使用pathtomybundle\Tests\TestCase;
使用pathtomybundle\Entity\Calendars;
需要_once dirname(uu DIR_uu)。'/TestCase.php';
类CalendarsDbTest扩展了TestCase
{
受保护的$日历;
公共功能设置()
{
父::设置();
$this->Calendars=新日历();
}
公共函数testGenerateCalendars()
{
$this->Calendars->setBeginDate(new\DateTime('now');
$this->Calendars->setDescription('Description');
$this->Calendars->setEndDate(new\DateTime('now'));
$this->Calendars->setType('sur titre');
//节约开支
$this->entityManager->persist($this->Calendars);
$this->entityManager->flush();
}
公共函数testUser(){
$this->assertEquals('Description',$this->Calendars->getDescription());
}
因此,我的问题是:

  • 为什么它会引发此错误“无法断言null与预期匹配”

  • 为什么
    getDescription()
    返回
    NULL

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

编辑

关于第三个问题:

例如,我有两个具有多对一关系的表Job和Calendar,因此我将在Calendars表中有一个Job\u Id字段,因此我将如何使用外键“Job\u 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-另一个问题:要创建数据库_测试,我使用“$this->generateSchema(); 因此,在第一次创建数据库之后,当测试再次调用“TestCase”类(上面的代码)时,他试图再次创建数据库\u测试,那么我必须在第一次之后删除该行,这是不好的,那么,在第一次运行测试时,我可以做些什么来只运行这一行

编辑-3

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

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

  • 与上面相同(存在null,因为您从未使用$this->Calendars调用setDescription-它与第一个测试中的对象不同)

  • 我不知道你到底是什么意思。你能更精确地说明你的意思吗(例如你想测试的方法)

  • 编辑:

    答案是:你不测试它。为什么?因为单元测试是单元测试-你应该在这里只测试你的实体。持久性、保持关系等是条令责任,应该在那里测试-你不用担心

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

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

  • 与上面相同(存在null,因为您从未使用$this->Calendars调用setDescription-它与第一个测试中的对象不同)

  • 我不知道你到底是什么意思。你能更精确地说明你的意思吗(例如你想测试的方法)

  • 编辑:

    答案是:你不测试它。为什么?因为单元测试是单元测试-你应该在这里只测试你的实体。持久性、保持关系等是条令责任,应该在那里测试-你不用担心

    唯一应该测试的是$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());
         }
    
         (...)
    }