Доступ к статической переменной из "setUpBeforeClass" в методе "DataProvider" в модульном тесте php - PullRequest
0 голосов
/ 18 октября 2018

Я пишу свой phpunit test.Мне нужно инициализировать метод dataprovider, чтобы сгруппировать один из моих тестов.Но я не могу получить статические переменные, объявленные в методе setUpBeforeClass.Эти переменные возвращают null мне.

Когда был выполнен поиск в Google, в документации сказано, что методы dataprovider будут выполняться до setUpBeforeClass.

Есть ли способ переопределить это и сделатьдоступ к статической переменной из dataprovider?

Пример кода

настройка перед функцией класса

public static function setUpBeforeClass()
{
    self::sampleVariable = 'Sample Data';
}

поставщик данныхфункция

public function sampleDataProvider()
{
    echo self::sampleVariable;
}

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

То, как PHPUnit обрабатывает методы провайдера данных, странно.Они не вызываются из того же объекта, на котором выполняются тесты, поэтому в объекте, к которому выполняется вызов DP, setupBeforeClass не будет выполнен.Это чертовски глупое ИМО, но я уверен, что есть причина, по которой это было сделано так, как это было (xmike объясняет это в своем ответе на самом деле. Не так глупо в конце концов; -).

Учитывая, что ваше присваивание является просто статическим значением (в любом случае в вашем примере), вы не можете просто объявить его как свойство класса вместо того, чтобы устанавливать его через setUpBeforeClass?Я полагаю, что ситуация может быть более сложной, чем демонстрирует ваш пример, препятствующий такому подходу: у меня есть только ваш пример, на котором я основываю свои предложения.

Другая вещь, которую нужно сделать, - это абстрагировать логику от setUpBeforeClass вотделите метод и вызовите этот метод как sampleDataProvider, так и setUpBeforeClass.

0 голосов
/ 18 октября 2018

Причина, по которой поставщики данных не связаны с потоком настройки тестового набора, заключается в том, что они могут быть определены как методы внешнего класса.Также речь идет о введении данных в тесты.Рассмотрим такой код:

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function __construct($name = null, array $data = array(), $dataName = '') {
        parent::__construct($name, $data, $dataName);
        var_dump('constructed');
    }
    public static function setUpBeforeClass() {
        parent::setUpBeforeClass();
        var_dump('beforeClass');
    }

    public function setUp(){
        var_dump('before');
    }

    /**
     * @dataProvider sampleDataProvider
     */
    public function testMethod($expected, $actual) {
        var_dump('test');
        $this->assertEquals($expected, $actual);
    }

    public function sampleDataProvider() {
        var_dump('dataProvider');
        return [
            [1, 1],
            [2, 2],
        ];
    }
}

при его запуске вы заметите, что сначала создается SampleTest экземпляр, затем вызывается dataProvider, затем создается два экземпляра SampleTest (один метод тестирования умножается на два набора данных из dataprovider.), затем перед запуском метода Class, затем метод test запускается дважды с введенными наборами данных от поставщика.

Не совсем ясно, каков ваш конкретный вариант использования, но возможно ли реорганизоватьслучай выше в что-то вроде:

class AnotherSampleTest extends PHPUnit_Framework_TestCase
{
    public function testMethod() {
        foreach ($this->sampleDataProvider() as $dataSet) {
            list($expected, $actual) = $dataSet;
            $this->assertEquals($expected, $actual);
        }
    }

    public function sampleDataProvider() {
        return [
            [1, 1],
            [2, 2],
        ];
    }
}

здесь sampleDataProvider - это просто обычный метод, поэтому вы отвечаете, как и когда вызывать его, и в любом случае он вызывается после setUpBeforeClass и setUp, поэтомуу него есть доступ к любому материалу, настроенному или измененному там, так что вы можете вносить любые необходимые изменения.

Недостатком такого подхода является то, что вы фактически теряете разбиение одного метода тестирования на несколько.Таким образом, это будет один тест с несколькими утверждениями по сравнению с несколькими тестами с несколькими утверждениями на каждый.Также вам, возможно, придется позаботиться о настройке (я имею в виду, что вам может потребоваться обновить что-то перед каждой итерацией) - это можно решить, вызвав setUp вручную (на первый взгляд).

Не думайтеМожно сделать любые дальнейшие предложения без каких-либо подробностей вашего конкретного случая использования.

0 голосов
/ 18 октября 2018

попробуйте объявить переменную sampleVariable как статическую и проверьте.

class MyClass
{  
private static $sampleVariable;
}
...