【问题标题】:How to use additionProvider with repository functions?如何将additionProvider 与存储库功能一起使用?
【发布时间】:2015-12-18 11:30:43
【问题描述】:

我正在尝试为我的 Symfony 2.7 项目配置测试类。我正在测试一个使用原则连接到数据库的控制器。

我终于设法扩展了 KernelTestCase 以避免这个致命错误:调用非对象上的成员函数“X”。但问题是:我试图通过使用additionProvider 来订购我的代码并将5 个测试函数简化为一个:

public function additionProvider()
{
    $first=$this->service->getTranslation("","en");
    return array
    (
         'original not created' =>array($first,"")
    );
}

我想像这样使用它:

    /**
     * @dataProvider additionProvider
     */
    public function testGetTranslation($expected, $actual)
    {
        $this->assertEquals($expected, $actual);
    }

这是我的 setUp():

public function setUp()    
{
    self::bootKernel();
    $this->em = static::$kernel->getContainer()
           ->get('doctrine')
           ->getManager()
            ;
    $this->service = new \DictionaryBundle\Controller\UtilController($this->em);
 }

我尝试像这样添加第一个测试,但错误再次出现,就像它无法访问存储库一样。那么,可以将 addittionProviders 与存储库功能一起使用吗?怎么样?

谢谢!

【问题讨论】:

    标签: php symfony doctrine-orm phpunit


    【解决方案1】:

    dataProvider 设置方法之前执行。所以service 变量还没有初始化。

    所以dataprovider方法只能返回data,需要把调用移到被测方法中的service。

    Here the paragraph of the doc:

    注意所有数据提供者都在调用之前执行 setUpBeforeClass 静态方法和第一次调用 setUp 方法。 因此,您无法访问从那里创建的任何变量 在数据提供者中。这是 PHPUnit 所必需的 能够计算测试的总数。

    【讨论】:

    • 现在我怀疑是将其拆分为 5 个不同的函数(一个用于每个不同的流执行),还是将它们放在一个带有许多断言的函数中。您认为哪种解决方案最干净?
    • 您可以继续使用 dataprovider:您还可以在测试方法中传递用于实例化服务的参数,数据提供者返回 'original not created' =>array("","en","") 并且测试方法使用传递的两个参数实例化服务。如果我解释我的意思,请告诉我。 :)
    • 嗯,你的意思是在数据提供者中返回服务的参数,然后在测试函数中执行它?
    • 是的,可以的话试试看
    • 我试过了,但我的数据有点乱,所以我把它们分成几个函数。再次感谢!
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 2014-01-09
    • 2013-02-24
    • 1970-01-01
    • 2011-08-25
    • 2021-03-09
    • 2015-03-20
    • 2019-12-19
    相关资源
    最近更新 更多