为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
拉风的咖菲猫 2022-07-29 10:47:21
我正在尝试创建一个基类来测试 Laravel 的验证规则,尽管在这种情况下,正在测试的并不是真正的问题。这是我做的:<?phpnamespace 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;}这就是我想实现它的方式:<?phpnamespace 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) WarningThe data provider specified for Tests\Unit\Rules\Text\ContainsLettersTest::testRuleWithValidInput is invalid.Data set #0 is invalid.这告诉我抽象基类上的测试方法可以执行,但无法解析数据提供者的实现。我不确定如何解决这个问题和/或是否可以解决。我试过了:谷歌搜索,这提出了这似乎有点相关,但看起来很久以前就已经修复/解决了尝试添加@dataProvider static::validRuleInput(更改validRuleInput为public abstract static方法后我希望我的测试用例的样板尽可能少,这似乎是实现这一目标的好方法,因为所有规则类都在验证一些输入并且不需要任何高级测试,而且我不希望每个测试都进行让所有测试样板验证这一点,但关注正在测试的规则和应该(无效)有效的数据。如果有更好的方法来做到这一点,我当然会全力以赴。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您应该为每个测试用例返回一个值列表,这些值将作为参数传递给测试方法。所以:


return [

    [ // <-- first test case

        '1st_argument_value',

        '2nd_argument_value',

    ],

    [ // <-- second test case

        '1st_argument_value',

        '2nd_argument_value',

    ],

];

如果你yield改用它会更清楚:


yield [ // <-- first test case

    '1st_argument_value',

    '2nd_argument_value',

];


yield [ // <-- second test case

    '1st_argument_value',

    '2nd_argument_value',

];


查看完整回答
反对 回复 2022-07-29
  • 1 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信