【问题标题】:Symfony2: PHPUnit Testing-> @dataProvider sends no multipleArraySymfony2:PHPUnit Testing-> @dataProvider 不发送 multipleArray
【发布时间】:2014-05-21 10:42:14
【问题描述】:

我为我的应用程序进行单元测试。

我有一个保存 saveArticleIds() 方法,我为它写了一个测试 -> testSaveArticleIds()。我有一个带有多个数组的 dataProvider articelIdsArray()。该函数需要该数组,就像这样。

/**
 *
 * @dataProvider articleIdsArray
 *
 */
public function testSavearticleIds($articleIds) {

    $articleIdObjekt = new ArticleIdHandler();
    $result = $articleIdObjekt->saveArticleIds($articleIds,false);

    $this->assertTrue($result);
}

public function articleIdsArray() {
    return array(
      array(
            10552 => 10552,
            14314 => 14314,
            21034 => 21034,
            22739 => 22739,
            34568 => 34568,
            34572 => 34572,
            35401 => 35401,
            38292 => 38292,
            55141 => 55141,
            161764 => 161764,
            181589 => 181589
       )
    );
}

当我运行测试时,我得到这个错误:

There was 1 error: 1) My\Bundle\ArticleBundle\Tests\Article\ArticleIdHandlerTest::testSaveArticleIds 
with data set #0  (10552, 14314, 21034, 22739, 34568, 34572, 35401, 38292, 55141, 161764, 181589)
Invalid argument supplied for foreach()

为什么它显示数组就像我在数组中没有键一样?我需要与我的 dataProvider 中完全相同的数组!任何的想法??非常感谢您的帮助!!!

【问题讨论】:

  • 请提供saveArticleIds($articleIds, false)的源代码。

标签: unit-testing symfony phpunit dataprovider


【解决方案1】:

也许试试这个:

public function articleIdsArray()
{
    return 
    array(
        array(
            array(
                10552  => 10552,
                14314  => 14314,
                21034  => 21034,
                22739  => 22739,
                34568  => 34568,
                34572  => 34572,
                35401  => 35401,
                38292  => 38292,
                55141  => 55141,
                161764 => 161764,
                181589 => 181589
            )
        )
    );
}

原因是数组嵌套的第一层是为每一轮测试提供的数据集,第二层代表提供给testSavearticleIds的参数,与函数的参数列表中的顺序相同(在您的示例只有一个参数),最后一级只是测试数组本身。

希望这会有所帮助...

【讨论】:

  • 不,很遗憾没有……!现在我的工作类中出现错误,该错误在我的 ArticleIdHandler 类中调用。
  • 这可能是一个“合法”的测试失败吗?当我尝试使用的代码时:`public function testSavearticleIds($articleIds){print_r($articleIds); $this->assertTrue(true);并得到了预期的数组作为输出...对不起格式,可以让它很好地显示...
【解决方案2】:

试试这个:

/**
 * @dataProvider articleIdsArray
 */
public function testSavearticleIds($articleIds)
{
    $articleIdObjekt = new ArticleIdHandler();
    $result = $articleIdObjekt->saveArticleIds($articleIds,false);

    $this->assertTrue($result);
}

public function articleIdsArray()
{
    return array(
        'scenario_one' => 10552,
        'scenario_two' => 14314,
        ...,
    );
}

【讨论】:

    【解决方案3】:

    您不需要在示例中使用@dataProvider。

    这样定义你的方法

    public function getArticleIdsArray() {
      return array(
         10552 => 10552,
         14314 => 14314,
         21034 => 21034,
         22739 => 22739,
         34568 => 34568,
         34572 => 34572,
         35401 => 35401,
         38292 => 38292,
         55141 => 55141,
         161764 => 161764,
         181589 => 181589
      );
    }
    

    并在你的测试中使用它

    public function testSavearticleIds($articleIds) {
    
        $articleIdObjekt = new ArticleIdHandler();
        $result = $articleIdObjekt->saveArticleIds($this->getArticleIdsArray(),false);
        $this->assertTrue($result);
    }
    

    【讨论】:

    • 不起作用,得到相同的错误,但每个 Id 11 次!太糟糕了。
    • 错误提示:数据集 #10552 无效。
    • 不要写这个@dataProvider articleIdsArray
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多