【问题标题】:PHPUnit dataProvider from database来自数据库的 PHPUnit dataProvider
【发布时间】:2016-03-21 13:57:33
【问题描述】:

我有简单的PostControllerTest 类:

<?php

namespace AppBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Bundle\FrameworkBundle\Client;

class PostControllerTest extends WebTestCase
{
    /**
     * @var Client
     */
    private $client;

    public function setUp() {
        $this->client = static::createClient();

    }

    public function idProvider()
    {
        return [
            ["1"],
            ["2"],
            ["3"],
        ];
    }

    /**
     * @dataProvider idProvider
     */
    public function testGet($id)
    {
        $this->client->request('GET', '/post/'.$id);
        $this->assertTrue($this->client->getResponse()->isSuccessful());
    }
}

testGet 方法使用idProvider 发出类似/post/{id} 的请求并断言成功响应,其中{id} 是数据库中Post 实体的真实id

一切正常,但如果 Postid = 1 将被删除怎么办?

我需要从数据库中获取一些id,例如最后一个或\和随机3个并将其传递给testGet作为dataProvider(或者不是dataProvider?)

我使用Symfony 2.8.3 和PHPUnit 5.2.11。

如何解决?任何建议表示赞赏。谢谢!

【问题讨论】:

  • 如何加载灯具数据?

标签: php symfony phpunit


【解决方案1】:

在运行测试之前,您应该确保应用程序的“正确”状态。 因此,您可以使用 setUp() 方法创建一个具有给定 id 的新帖子,然后运行测试,而不是指望那里有帖子。

对空白的测试专用数据库运行测试可能是个好主意。这将使您的测试非常可预测,因此您不必担心将 id 从 setUp 方法传递到您的 testCase。

否则,您可以使用静态方法创建一个辅助类,用于存储稍后可以提取的“事物”。在您的情况下可能足够的另一种解决方案是创建一个单独的类属性来存储帖子 ID。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这个比较棘手,因为据我所知,dataProviders 不能调用上下文化方法,只能调用静态方法,因为它们是在类实例化之前调用的。

    解决方法是停止使用 dataProviders 并在断言中执行循环:

    public function testGet($id)
    {
        $howMany = 3;
        //This method should create posts using your Business Logic layer
        $posts = $this->createPosts($howMany);
        foreach($posts as $post){
            $this->client->request('GET', '/post/'.$post->getId());
            $this->assertTrue($this->client->getResponse()->isSuccessful());
        }
    }
    

    顺便说一句,只是说这些测试往往相当慢,所以我会问自己是否值得为了同样的事情检查 3 次,而不是尝试一个存在的和另一个没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2021-08-29
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多