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