在提供程序中成功设置的属性在测试中被重写为null


Property successfully set in provider overwritten as null in the test

在成功初始化提供程序中的属性mock(我这样做是因为我想将该属性作为参数传递,如果它没有在提供程序中初始化,则会因为道具为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')
    );
  }
}

我想您想知道为什么会发生这种情况。PHPUnit的文档实际上解释了这一点:

票据

所有数据提供程序都在调用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')
        );
    }
}