属性在提供程序中成功设置,在测试中覆盖为null

时间:2016-08-04 07:22:45

标签: php phpunit

在我成功初始化提供程序中的属性mock之后(我这样做是因为我想将属性作为参数传递,如果它未在提供程序中初始化,则会因为prop为null而发生错误)并传递它测试中,我遇到了一个问题:该属性被覆盖为null

class Test extends \PHPUnit_Framework_TestCase
{    
protected $mock;    

/**
 * @param $arg List of objects from DB     
 *
 * @dataProvider providerTest
 */
public function test($arg)
{
    var_dump($this->mock) // ---> NULL
}


public function providerTest()
{
    $this->mock = $this->getMockBuilder(Currency::class)
        ->disableOriginalConstructor()
        ->getMock();

    var_dump($this->mock) // -----> OBJECT

    return array(           
       array('argument')
    );
  }
}

1 个答案:

答案 0 :(得分:2)

我认为你想知道为什么这种情况发生了。 PHPUnit的documentation实际上解释了这一点:

  

请注意

     

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

因此,您应该将MockObject的创建移动到setUp()方法中,或者直接移动到使用数据提供程序的测试方法中:

class Test extends \PHPUnit_Framework_TestCase
{    
    protected $mock;

    protected function setUp()
    {
        $this->mock = $this->getMockBuilder(Currency::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    /**
     * @param $arg List of objects from DB     
     *
     * @dataProvider providerTest
     */
    public function test($arg)
    {
        var_dump($this->mock) // ---> MockObject
    }

    public function providerTest()
    {
        return array(           
            array('argument')
        );
    }
}