【问题标题】:phpunit - how to merge 2 data providersphpunit - 如何合并 2 个数据提供者
【发布时间】:2014-11-19 10:16:49
【问题描述】:

我有 2 个不同的数据提供者,我想将来自这两个数据提供者的数据用于我的测试用例。

我在 dataProviders 部分做了一个数组合并

  public function provider_data() {

    $data1 = $this->getData('home_data');

    $data2= $this->getData('data2');

   $newarray = array_merge($data1, $data2);

    return $newarray;
}

但是我看到我的测试用例被执行了两次,我注意到测试用例实际上是为每个数组(Data1 和 Data2)单独执行的,尽管它们被合并了。我在这里做错了什么?我应该如何组合 2 个数据提供者(两个数据提供者的输入数据格式完全不同)

【问题讨论】:

标签: php phpunit


【解决方案1】:

我想我也会发布这个答案,以尝试合并 2 个不同长度的数组。我用了这个逻辑

    $data1 = $this->loadData('data1');
    $data2 = $this->loadData('data2');
    $newarray = array();
    foreach($data1 as $key1 => $value1){
        foreach ($data2 as $key2 => $value2) {
            $newarray[] = array_merge($value2, $data1[$key1]);   
        }
    } 
return $newarray;

【讨论】:

    【解决方案2】:

    您需要做一些更深入的事情,而不仅仅是简单的array_merge。数据提供者提供了一个数组,其中每个条目都是一个单独的测试用例。每个测试用例都是一个包含参数的数组。像这样:

    'testCase 1' => array(
         0 => argument 1,
         1 => argument 2
     ),
     'testCase 2' => array(
         0 => argument 1,
         1 => argument 2
     ),
    

    既然你说你的测试运行了两次,每个数据提供者必须只提供一个条目。 array_merge 将第二个数据提供者数组附加到您的第一个数组中,创建两个测试用例。如果您想合并每个数据提供者提供的数据,您需要执行以下操作:

    public function provider_data() {
        $data1 = $this->getData('home_data');
        $data2 = $this->getData('data2');
    
        $testCases = array();
    
        foreach ($data1 as $key => $arguments) {
            $testCases[] = array_merge($arguments, $data2[$key]);
        }
    
        return $testCases;
    }
    

    这会从第二组数据中获取参数并将其附加到第一组数据中的参数。现在您的测试将接收来自两个数据提供者的组合参数。

    这假设两个数据数组的长度相同。如果它们可能不是,您将需要添加一些逻辑来处理这种情况。还要记住参数列表,PHPUnit 不引用用于将参数与变量匹配的键。它仅基于数组中值的顺序。所以要小心你的测试用例中的参数。

    【讨论】:

    • 谢谢!这真的很有帮助!
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2013-02-14
    • 2018-02-02
    • 2018-05-17
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多