- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我对 Symfony FormType 测试有疑问。 http://symfony.com/doc/current/cookbook/form/unit_testing.html
在我的表单类型中,entity
类型很常见。使用学说实体表单类型测试表单类型是可怕的。
这是我的表单域。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('products', 'entity', array(
'class' => 'AcmeDemoBundle:Product',
'label' => 'Product',
'property' => 'name',
'required' => false,
'mapped' => true,
'multiple' => true,
'expanded' => true
));
}
这是该领域的模拟。
private function getEntityTypeMock()
{
$entityRepositoryMock = $this->getMockBuilder('Doctrine\ORM\EntityRepository')
->disableOriginalConstructor()
->getMock()
;
$entityRepositoryMock->expects($this->once())
->method('findAll')
->will($this->returnValue(array()));
$classMetaDataMock = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')
->disableOriginalConstructor()
->getMock();
$mockEntityManager = $this->getMockBuilder('Doctrine\ORM\EntityManager')
->disableOriginalConstructor()
->getMock();
$mockEntityManager->expects($this->any())
->method('getClassMetadata')
->will($this->returnValue($classMetaDataMock));
$mockEntityManager->expects($this->once())
->method('getRepository')
->will($this->returnValue($entityRepositoryMock));
$mockRegistry = $this->getMockBuilder('Doctrine\Bundle\DoctrineBundle\Registry')
->disableOriginalConstructor()
->getMock();
$mockRegistry->expects($this->any())
->method('getManagerForClass')
->will($this->returnValue($mockEntityManager));
$mockEntityType = $this->getMockBuilder('Symfony\Bridge\Doctrine\Form\Type\EntityType')
->setMethods(array('getName'))
->setConstructorArgs(array($mockRegistry))
->getMock();
$mockEntityType->expects($this->any())->method('getName')
->will($this->returnValue('entity'));
return $mockEntityType;
}
这真的是正确的方法吗?在 TypeTestCase
中,我无权访问任何内容,没有容器,没有内核,什么都没有。这使得测试表单类型变得非常困难和令人沮丧。
有没有更好的方法来测试表单类型?或者更简单的方法来处理具有 ORM 依赖性的类型?
干杯。
最佳答案
我在对非常依赖服务容器的东西进行单元测试时遇到了困难。起初我试着像你一样 mock 一切。这可以使单元测试通过很大的努力(服务倾向于依赖 Symfony 中的其他服务,这些服务也必须被模拟),但是需要更多的努力来确保通过测试意味着它会处理您希望它处理的数据。
此外,对数据库进行单元测试是出了名的困难,而且很少被讨论。我不确定我分享的是否是“最佳”答案,但这是一个对我有用的答案,它有助于对实际服务进行单元测试。因此,我发现它是一种比模拟服务更有效的测试方法。
这是基于一篇很棒的文章,当然,我现在找不到它(如果我找到它,我会更新它以感谢他们)。
基本上,您可以将 bundle 设置为在测试中包含容器。
Composer .json:
"require-dev": {
"sensio/framework-extra-bundle": ">=3.0",
"symfony/asset": ">=3.2"
}
然后创建一个 config.yml
,其中包含您可能需要的任何服务以及 Symfony 表单的最低限度:
framework:
secret: 'shh'
form: ~
validation: { enable_annotations: true }
session:
storage_id: session.storage.mock_file
doctrine:
# your doctrine settings if you want to test against the DB
创建一个 AppKernel 类。
class AppKernel extends Kernel
{
public function registerBundles()
{
return array(
new FrameworkBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
// any other bundles you need
);
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config.yml');
}
public function getLogDir()
{
return '/tmp/log/' . $this->environment;
}
}
最后,我在我的基本 TestCase 中创建了一个辅助类:
protected function getContainer()
{
if (!isset($this->kernel)) {
$this->kernel = new AppKernel('test', true);
$this->kernel->boot();
}
if (!isset($this->container)) {
$this->container = $this->kernel->getContainer();
}
return $this->container;
}
现在您可以像这样访问您已注册的任何服务:
public function testContainerAccess()
{
$this->assertTrue(is_object($this->getContainer());
$this->assertTrue($this->getContainer()->get('doctrine.orm.entity_manager') instanceof \Doctrine\ORM\EntityManagerInterface);
}
针对数据库的测试总是很棘手,并且是一个单独的蠕虫病毒。在这种情况下,最简单的做法可能是创建一个单独的测试架构并针对它运行查询。
希望这对您有所帮助。
关于php - Symfony FormType 测试处理 EntityType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080027/
我开始从事一个用 Symfony 2.8 编写的大型项目。将整个项目升级到 SF 3 需要数百小时,现在还不可能。我想到了一个想法,将 symfony/symfony 包解压到它替换的单个包中(com
我在提交表单后使用 FOSUserEvents,但订阅者调用了两次。 这样我的验证码第一次有效第二次无效 这是我的代码 router = $router; $this->request
我有以下路线: blog_show: path: /test/123 defaults: { _controller: TotalcanBravofillBundle:Te
我是测试新手。我想测试我的功能。我已经成功安装了 phpUnit。我在互联网上查看了许多教程。但我无法获得有关测试的正确信息。这是我的功能代码: public function loginAction
我正在尝试重现 facebook batch requests 的行为在他们的图形 api 上运行。 所以我认为最简单的解决方案是在 Controller 上向我的应用程序发出几个请求,例如: pub
在 Symfony Progress Bar documentation有一个超酷酒吧的示例图像。不幸的是,看起来文档的其余部分没有解释如何获得这样的结果。 这是图片,以防您错过: 我怎么才能得到它?
我使用Finder发送假脱机电子邮件,但是自动名称生成器将点放在文件名中,有时它们出现在文件的开头。 查找程序似乎无法获取具有该名称的文件-那些文件被隐藏了……有人经历过这种行为吗?有什么建议如何使用
我正在尝试进行 LDAP 身份验证,我目前遇到此类错误: ServiceNotFoundException: The service "security.firewall.map.context.ma
有没有办法验证和检查集合数组是否为空。我已经尝试过: /** * @Assert\NotBlank() * @Assert\Length( min = 1) */ protected $work
使用Smyfony2和Doctrin2,可以使用以下示例创建数据固定装置:http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/i
我看到在大多数Symfony 2示例中,例如,不存在记录时,Symfony 2会引发异常。我认为这种方法对最终用户不友好。为什么有人更喜欢引发异常而不在Flashbag上添加一些错误消息? 最佳答案
我对项目中的以下服务有疑问: app.security.guardAuthenticatorLoginPassword: class: AppBundle\Security\LoginPa
symfony缓存和登录Docker容器存在问题。 Web服务器从www-data用户和组执行,当我使用docker上安装的php从docker容器中清除symfony缓存时,它从root执行。 因此
我想了解 symfony 中的服务 我已阅读http://symfony.com/doc/2.3/book/service_container.html#creating-configuring-se
因为我对 Symfony 和 Doctrine 还很陌生,所以我有一个可能很愚蠢的问题;-) 有人可以用简单的词语向我解释集合(尤其是实体中的ArrayCollections)吗?它是什么以及何时以及
我收到了这个表格: {{ form_start(form) }} {{ form_end(form) }} 我想检查用户是否登录,我这样做了: {% if is_g
我的网站已准备好部署,我正在尝试将其设置为在线。 一些信息: 主持人是 OVH。 它不允许 SSH,我必须使用 FTP 发送文件。也没有命令行。 我现在希望能够在子目录中设置网站:/www/test(
过去几个月以来,我一直在尝试与symfony合作。昨晚我自动删除了不需要的存储库。之后,我无法使用symfony命令创建新的symfony项目。当我在终端中运行Symfony new Security
In the environnement variable, then in system variable, I edited the path and added在环境变量中,然后在系统变量
我们有一个 Symfony 1.4 应用程序,想升级到 Symfony 4。是否有可能或者我们必须重新编程该应用程序? 我们询问了我们附近的一家软件公司,他们告诉我们必须重新编写应用程序。 最佳答案
我是一名优秀的程序员,十分优秀!