PHPUnit是面向程序员的PHP测试框架。它是单元测试框架的xUnit体系结构的一个实例。
在 CommonHelper 类中: 类 CommonHelper { 公共静态函数 getValue(字符串 $category, 字符串 $name) { } } 在 MyService 类中: 公共函数 getContentOrtherService():
CakePHP 2.1:使用组件重定向时,使用 $this->testAction() 测试控制器时,$this->headers 未设置
我开始为应用程序编写测试,并且我已经制作了一个包装器 RedirectComponent 来处理所有重定向。 现在我开始测试我的应用程序(我对测试还很陌生)我
我可以从 devspace 或 kubectl 调试 IntelliJ/PhpStorm 中的 PHPUnit 测试吗?
我有许多微服务在 kubernetes/devspace 环境中本地运行。 基于此和此,IntelliJ 和 PhpStorm 不支持从 devspace 或 kubectl 内运行 PHPUnit 测试。 所以...
因此,当尝试按持续时间排序测试时,我试图了解这是如何工作的。 或者更确切地说,确定持续时间顺序的数据来源是什么? 是序列化的代码覆盖率数据吗
我正在为这个课程编写一个单元测试: 我正在为这门课编写单元测试: <?php namespace AppBundle\Managers\CRUD; use Doctrine\ORM\EntityManager; use CommonLibs\Interfaces\CrudManagerInterface; use AppBundle\Entity\Pet; use CommonLibs\Helpers\PaginatorHelper; use AppBundle\Entity\Person; use AppBundle\Managers\CRUD\PetManager; use AppBundle\AppBundle; class PersonManager extends CrudManagerInterface { /** * @var EntityManager */ private $em; /** * @var PetManager */ private $petManager; public function __construct(EntityManager $em,PetManager $petManager) { $this->em=$em; $this->petManager=$petManager; } /** * {@inheritDoc} * @see \CommonLibs\Interfaces\CrudManagerInterface::search() * @return AppBundle\Entity\Person[] */ public function search(array $searchParams, array $order, $page, $limit) { $queryBuilder=$this->em->createQueryBuilder(); $queryBuilder=$queryBuilder->select('p')->from('AppBundle:Person','p'); if(isset($searchParams[Person::NAME])) { $queryBuilder->andWhere('p.name LIKE :name')->setParameter('name','%'.$searchParams[Person::NAME].'%'); } $petNameSearch=isset($searchParams[Pet::NAME]); $petTypeSearch=isset($searchParams[Pet::TYPE]); if( $petNameSearch || $petTypeSearch ) { $queryBuilder->join('p.pets','pe'); if($petNameSearch) { $queryBuilder->andWhere('pe.name LIKE :pet_name')->setParameter('pet_name','%'.$searchParams[Pet::NAME].'$'); } if($petTypeSearch) { if(!is_array($searchParams[Pet::TYPE])) { $searchParams[Pet::TYPE]=array($searchParams[Pet::TYPE]); } $queryBuilder->andWhere('pe.type IN (:pet_types)')->setParameter('pet_types',$searchParams[Pet::TYPE]); } /** * @var Doctrine\ORM\Query */ $query=$queryBuilder->getQuery(); if((int)$limit>0) { $query->setFirstResult(PaginatorHelper::calculateFirstResult($page,$limit))->setMaxResults((int)$limit); } $results=$query->getResult(); return $results; } } /** * {@inheritDoc} * @see \CommonLibs\Interfaces\CrudManagerInterface::getById() * @return AppBundle\Entity\Person */ public function getById($id) { return $this->em->getManager('AppBundle:Person')->findById($id); } /** * {@inheritDoc} * @see \CommonLibs\Interfaces\CrudManagerInterface::add() * * @param array $dataToAdd * * $dataToAdd Must have one of the follofiwng formats: * * FORMAT 1: * [ * Person:NAME=>"value" * ] * * FORMAT 2: * * [ * [ * Person:NAME=>"value" * ], * [ * Person:NAME=>"value" * ], * [ * Person:NAME=>"value" * ] * ] * * @return AppBundle\Entiry\Person[] with the modified persons */ public function add(array $dataToAdd) { /** * @var AppBundle\Entiry\Person $insertedPersons */ $insertedPersons=[]; foreach($dataToAdd as $key=>$data) { $personToInsert=new Person(); if(is_array($data)) { $personToInsert=$this->add($data); if($personToInsert==false) { return false; } } elseif(!$this->setReference($personToInsert,$key,$data)) { $personToInsert->$$key=$data; } if(is_array($personToInsert)) { $insertedPersons=array_merge($insertedPersons,$personToInsert); } else { $this->em->flush($personToInsert); $insertedPersons[]=$personToInsert; } } if(!empty($insertedPersons)) { $this->em->flush(); } return $insertedPersons; } /** * {@inheritDoc} * @see \CommonLibs\Interfaces\CrudManagerInterface::edit() */ public function edit(array $changedData) { $em=$this->em->getManager('AppBundle:Person'); foreach($changedData as $id => $fieldsToChange) { $item=$this->getById($id); foreach($fieldsToChange as $fieldName=>$fieldValue){ if(!$this->setReference($item,$fieldName,$fieldValue)){ $item->$$fieldName=$fieldValue; } } $em->merge($item); } $em->flush(); } /** * {@inheritDoc} * @see \CommonLibs\Interfaces\CrudManagerInterface::delete() * * @param array changedData * Should contain data in the following formats: * FORMAT 1: * * [ * Person::ID=>^an_id^ * Person::NAME=>^a name of a person^ * ] * * FORMAT2: * [ * Person::ID=>[^an_id1^,^an_id2^,^an_id3^...,^an_idn^] * Person::NAME=>^a name of a person^ * ] * * The $changedData MUST contain at least one of Person::ID or Person::NAME. * Therefore you can ommit one of Person::ID or Person::NAME but NOT both. */ public function delete(array $changedData) { $queryBuilder=$this->em->createQueryBuilder(); $queryBuilder->delete()->from('AppBundle:Person','p'); $canDelete=false; if(isset($changedData[Person::ID])) { if(!is_array($changedData[Person::ID])) { $changedData[Person::ID]=[$changedData[Person::ID]]; } $queryBuilder->where('person.id IN (:id)')->bindParam('id',$changedData[Person::ID]); $canDelete=true; } if(isset($changedData[Person::NAME])) { $queryBuilder->orWhere('person.name is :name')->bindParam('name',$changedData[Person::NAME]); $canDelete=true; } if($canDelete) { $query=$queryBuilder->getQuery(); $query->execute(); } return $canDelete; } /** * Set referencing fields to person. * * @param AppBundle\Entiry\Person $item The item to set the reference * @param string $referencingKey A string that Indicates the input field. * The strings for the param above are defined as constants at AppBundle\Entiry\Person. * @param mixed $referencingValue The value of referencing key * * @return boolean */ private function setReference($item,$referencingKey,$referencingValue) { /** * @var AppBundle\Entity\Pet $pet */ $pet=null; if($referencingKey===Person::PET) { if(is_numeric($referencingValue)) {//Given pet id $pet=$this->petManager->getById($referencingValue);//Searching pet by id } elseif (is_object($referencingValue) && $referencingValue instanceof AppBundle\Entity\Pet ){//Given directly a pet Object $pet=$referencingValue; } $item->$$referencingKey=$referencingValue; return true; } return false; } } 我想模拟 Doctrine 的实体管理器。但我不知道要返回什么才能成功使用 Doctrine 的查询生成器,但没有实际的数据库连接。 好吧,如果你想真正遵循最佳实践,你不应该嘲笑实体管理器,因为你不拥有它;您可以在以下链接阅读更多内容 https://github.com/mockito/mockito/wiki/How-to-write-good-tests https://adamwathan.me/2017/01/02/dont-mock-what-you-dont-own/ https://8thlight.com/blog/eric-smith/2011/10/27/thats-not-yours.html 好吧,现在,如果你想走那条路,你可以像嘲笑 EntityManager 中的所有其他对象一样嘲笑 PHPUnit 如果您使用 PHPUnit >= 5.7 且 PHP > 5.5 $mockedEm = $this->createMock(EntityManager::class) 或 PHP <= 5.5 $mockedEm = $this->createMock('Doctrine\\ORM\\EntityManager'); 一旦你模拟了它,你就必须声明所有预设的响应和期望:预设的响应是为了让你的代码工作,而期望是为了让它成为一个模拟 举个例子,这应该是罐头的 return $this->em->getManager('AppBundle:Person')->findById($id); 正如您将看到的,为每个方法调用声明一个固定方法可能非常困难且过度;例如,在这里,你应该这样做 $mockedEm = $this->createMock(EntityManager::class) $mockedPersonManager = $this->createMock(...); $mockedEm->method('getManager')->willReturn(mockedPersonManager); $mockedPersonManager->findOneBy(...)->willReturn(...); (当然你必须用实际值替换...) 最后,记住模拟不是存根
我是 Laravel 和软件测试的初学者。我的问题不是如何使用 PHPunit 或任何测试框架的断言或提供的帮助程序。我主要关心的是
我正在尝试使用 phpunit 对我的数据库进行测试,并将数据库迁移到内存。 第一次测试运行得很好: /** @测试 */ 公共函数 it_fetches_a_single_ano_letivo() ...
我想测试方法 checkCredentials() 的输出: 类 BuildParticipant { 公共函数 __construct(DBConnectionWrapper $db, ?Logger $logger=null) { $this->参与者 =...
在我的应用程序中,SQLite 可以工作。但是当我在 PHPUnit 中创建测试时,它会在第一次写入时被锁定。我已经侵入了一些 beginTranaction() 和 commit() 但它仍然挂在 commit() 调用上。测试
Laravel 11:是否可以强制 PHPUnit 触发/“按”CTRL+C 来模拟 artisan 命令的中断?
我有一个 artisan 命令,可以运行几分钟或几小时,在 handle() 方法中循环处理大量记录。 我已经介绍了通过...来中断如此漫长的过程的能力
如果我提前计划并列出(作为评论)所有测试,它还会是 TDD 吗?
当我在写下测试之前就开始计划时,它还会算 Tdd 吗?我的意思是创建带有注释的测试用例名称的测试文件。这样我就可以预测并预测...
我正在寻找一种解决方案,在开始所有测试之前清除 Laravel 中的缓存(请注意,我的意思是所有测试,而不是每个测试): $this->artisan('缓存:清除'); $this->工匠('r...
Laravel - 使用 PHP UNIT 在命令中模拟单个方法
我正在尝试测试一个命令,其中有一个我想要模拟的方法,因为它使用 Guzzle 调用外部服务,但无论我尝试什么,我似乎都无法成功模拟它。这都...
我正在使用 Phpunit。如果我只是运行我的测试: phpunit --log-junit 输出.xml 这在一秒钟内运行。但如果我想要代码覆盖率: phpunit --coverage-html ./report --log-junit 输出.xml
我正在尝试编写一个可测试的 Laravel 4 应用程序。在 Taylor Otwells 关于 Laravel 的书中 https://leanpub.com/laravel 他写道,我们应该考虑在 Valida 中创建一个 UserValidator 类...
当我使用 Phpstorm 运行测试时,一切都按预期工作,并且连接切换到 mysql_test。但是当我手动运行 php artisan test 时,连接不会切换并保持 mysql。 phpuni...
编辑:读完其中一条评论后,我意识到我在原来的帖子中说错了,我做了一些编辑来澄清。本质上,我需要检查结果,但我正在努力解决这个问题......
如何在单元测试中使用reflectionClass测试控制器的受保护方法?
环境 Windows10 菲尔康 3.2.4 适用于 Windows 18.03.1-ce-win65 的 Docker phpunit 5.7.27 问题 我想使用 ReflectionClass 和 phpunit 来测试我的控制器的私有属性,但我没有...
在我的 Export 类中我创建了这个方法: 公共函数 getBranches() { 返回分支::all(); } 我想模拟这个方法。现在我在测试用例中有以下代码: 百万美元...