在抽象基类中使用@dataProvider 并在实际测试中实现

我正在尝试创建一个基类来测试 Laravel 的验证规则,尽管在这种情况下,正在测试的并不是真正的问题。


这是我做的:


<?php


namespace Tests\Unit\Rules;


use Tests\TestCase;

use Illuminate\Contracts\Validation\Rule;


abstract class RuleTestCase extends TestCase

{

    protected Rule $rule;


    public function setUp(): void

    {

        parent::setUp();


        $this->rule = $this->initializeRule();

    }


    /**

     * @dataProvider validRuleInput

     *

     * @param mixed $value

     */

    public function testRuleWithValidInput($value): void

    {

        $this->assertTrue($this->rule->passes('attribute', $value));

    }


    /**

     * @dataProvider invalidRuleInput

     *

     * @param mixed $value

     */

    public function testRuleWithInvalidInput($value): void

    {

        $this->assertFalse($this->rule->passes('attribute', $value));

    }


    abstract public function validRuleInput(): array;


    abstract public function invalidRuleInput(): array;


    abstract public function initializeRule(): Rule;

}

这就是我想实现它的方式:


<?php


namespace Tests\Unit\Rules\Text;


use App\Rules\Text\ContainsLetters;

use Illuminate\Contracts\Validation\Rule;

use Tests\Unit\Rules\RuleTestCase;


class ContainsLettersTest extends RuleTestCase

{

    public function validRuleInput(): array

    {

        return [

            'abcd',

            'a2c4',

            '!b#d',

        ];

    }


我希望这可以工作,因为数据提供者是在正在测试的类中实现的,尽管实际的测试方法是在抽象基类中实现的。


执行 phpunit 时,我收到以下警告:


1) Warning

The data provider specified for Tests\Unit\Rules\Text\ContainsLettersTest::testRuleWithValidInput is invalid.

Data set #0 is invalid.

这告诉我抽象基类上的测试方法可以执行,但无法解析数据提供者的实现。


我不确定如何解决这个问题和/或是否可以解决。我试过了:


谷歌搜索,这提出了这似乎有点相关,但看起来很久以前就已经修复/解决了

尝试添加@dataProvider static::validRuleInput(更改validRuleInput为public abstract static方法后

我希望我的测试用例的样板尽可能少,这似乎是实现这一目标的好方法,因为所有规则类都在验证一些输入并且不需要任何高级测试,而且我不希望每个测试都进行让所有测试样板验证这一点,但关注正在测试的规则和应该(无效)有效的数据。如果有更好的方法来做到这一点,我当然会全力以赴。


拉风的咖菲猫
浏览 102回答 1
1回答

慕姐4208626

您应该为每个测试用例返回一个值列表,这些值将作为参数传递给测试方法。所以:return [&nbsp; &nbsp; [ // <-- first test case&nbsp; &nbsp; &nbsp; &nbsp; '1st_argument_value',&nbsp; &nbsp; &nbsp; &nbsp; '2nd_argument_value',&nbsp; &nbsp; ],&nbsp; &nbsp; [ // <-- second test case&nbsp; &nbsp; &nbsp; &nbsp; '1st_argument_value',&nbsp; &nbsp; &nbsp; &nbsp; '2nd_argument_value',&nbsp; &nbsp; ],];如果你yield改用它会更清楚:yield [ // <-- first test case&nbsp; &nbsp; '1st_argument_value',&nbsp; &nbsp; '2nd_argument_value',];yield [ // <-- second test case&nbsp; &nbsp; '1st_argument_value',&nbsp; &nbsp; '2nd_argument_value',];
打开App,查看更多内容
随时随地看视频慕课网APP