解决Missing argument 1 for…

原文地址:解决Missing argument 1 for DataTest::testAdd() 作者:晨风
在使用PHPUnit的DataProvider方法时,按官方帮助文档所说编写测试脚本如下:
<?php
class DataTest extends PHPUnit_Framework_TestCase
{
  public function provider()
  {
        return array(
                      array(0, 0, 0),
                      array(0, 1, 1),
                      array(1, 0, 1),
                      array(1, 1, 3)
                    );
  }

public function testAdd($a, $b, $c)
{
      $this->assertEquals($c, $a + $b);
  }
}
?>
运行该测试脚本时总会出现如下错误提示:
Missing argument 1 for DataTest::testAdd()

于是上google和baidu分别搜索了一把,能找到的帮助不多,但基本上有以下两种解决方案
方案一:是说provider()方法必须是静态的,也就是说该方法应该写成如下形式:
public static function provider()
  {
        return array(
                      array(0, 0, 0),
                      array(0, 1, 1),
                      array(1, 0, 1),
                      array(1, 1, 3)
                    );
  }
方案二:不仅将provider()方法设计成静态的,而且还将整个代码改成如下样式:
<?php

class DataTest extends PHPUnit_Framework_TestCase
{
    protected static $myData = array(
      array(0, 0, 0),
      array(0, 1, 1),
      array(1, 0, 1),
      array(1, 1, 3)
    );
 
    public static function provider()
    {
        return self::$myData;
    }
 
     public function testAdd($a, $b, $c)
    {
        $this->assertEquals($c, $a + $b);
    }
}
?>
其实方案一和二有着异曲同工之处,但不论我怎么改问题依然如故。
无奈之余,我将代码进行归并整理,又写成了如下样式:
<?php
class DataTest extends PHPUnit_Framework_TestCase
{
  public static function provider()
  {
     return array(
            array(0, 0, 0),
            array(0, 1, 1),
            array(1, 0, 1),
            array(1, 1, 3)
           );
  }
 

  public function testAdd($a, $b, $c)
{
      $this->assertEquals($c, $a + $b);
  }
}
?>
再次试着运行测试脚本,让人兴奋的是居然可以成功运行了,呵呵,真有柳暗花明的妙处。细看下来解决此问题主要有以下两点:
1.provider必须是静态方法,因此该方法添加了static关键字;
2.注释 @dataProvider provider确是至关重要的,该注释指明了测试方法要调用的provider,将返回一个包含有数组参数的数组对象供测试方法调用。
  

你可能感兴趣的:(解决Missing argument 1 for…)