Передача данных dataProviders для установки [PHPUnit] - PullRequest
0 голосов
/ 07 апреля 2020

Я впервые пытаюсь заставить работать PHPUnit; Я хочу передать данные в метод TestCase setUp(), чтобы я мог создать новый экземпляр для каждого теста. Когда я пишу ...

protected $furniture;

/**
* Instantiate an instance of Furniture for use with all test methods not involved with class constructor objectives
* @dataProvider validConstructorArgumentProvider
*/
protected function setUp($sku, $name, $price, $dimensions) : void
{
    $this->furniture = new Furniture($sku, $name, $price, $dimensions);

}

в начале моего класса, тогда бегун теста выдает следующие ошибки:

ArgumentCountError: Too few arguments to function WebApp\tests\FurnitureTest::setUp(), 0 passed in /Users/ScottAnderson/Documents/Tech/commissions/shopping_app_test/vendor/phpunit/phpunit/src/Framework/TestCase.php on line 1024 and exactly 4 expected

Я заметил this :

Все поставщики данных выполняются перед вызовом метода setUpBeforeClass () stati c и первым вызовом метода setUp (). Из-за этого вы не можете получить доступ к любым переменным, которые вы там создаете, из провайдера данных. Это необходимо для того, чтобы PHPUnit мог вычислить общее количество тестов.

Мой указанный поставщик данных выглядит так:

private function validConstructorArgumentProvider()
{
    return [
        ["TBL11FN", "Table", 60.0, [120, 50, 70]],
        ["CBN33FN", "Cabinet", 70.0, [60, 120, 210]],
        ["DSK5FN", "Desk", 55.0, [180, 70, 70]],
        ["PCT102FN", "Picture Frame", 13.0, [60, 40, 4]],
        ["LMP40FN", "Lamp Shade", 9.0, [40, 40, 25]]
    ];
}

... так что, возможно, это так невозможно передать аргументы dataProvider в setUp(), но в этом случае я не вижу смысла в функции установки per-test-method . Можно ли передать аргументы из dataProvider в `setUp ()?

NB : я видел это , но я выполнил шаги для наиболее предпочтительного ответа и мне все еще не везет

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Невозможно передать данные от поставщика данных на setUp().

0 голосов
/ 20 апреля 2020

Ранее я написал совершенно неправильный ответ, однако теперь у меня есть кое-что, что достигает того, что я хочу.

Из чтения этот ответ получается более точно, что dataProvider выполняется раньше функция настройки. Мой исправленный код выглядит следующим образом:

class ThingTest extends TestCase
{

    protected ?Thing $instance;        


    public function setUp()
    {
        parent::setUp();
        $args = $this->getProvidedData();

        if (count($args) !== 2)
        {
            $this->furniture = null;
            return;
        }
        $this->furniture = new Furniture(...$args);
    }


    /**
    * @dataProvider instanceProvider
    */
    public function testValidInstanceCanBePrinted()
    {
        //testing code
    }

    /**
    * @dataProvider constructorArgsProvider
    */
    public function testCanBeInstantiatedWithValidArgs()
    {
        //testing code
    }



   public function constructorArgsProvider()
   {
        return [ ["these", "are" ], ["some", "args"], ["as", "example"] ]
}

NB : тест длины был из-за того, что у меня есть недопустимые аргументы конструктора с ожидаемым исключением в конце в качестве альтернативного поставщика данных

...