我正在尝试创建一个基类来测试 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',
];
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消