如何在 Laravel 中模拟验证规则
Posted
技术标签:
【中文标题】如何在 Laravel 中模拟验证规则【英文标题】:How to mock a Validation Rule in Laravel 【发布时间】:2019-12-14 15:11:48 【问题描述】:我想模拟一个自定义验证规则(例如 App\Rules\SomeRule)。但是当我运行我的测试时,它给出了一个Mockery\Exception\InvalidCountException: Method...should be called
exactly 1 times but called 0 times.
我已经阅读了 Laravel 的文档 on Mocking、on custom Validation Rules、Service Containers、Service Providers,但我无法弄清楚为什么我没有成功地模拟规则。
我阅读了this thread,但我很难将它与我的问题联系起来,即“我如何测试我的应用程序是否正在使用此规则”。还是那是我无法测试的东西?
这是我的规则
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class SomeRule implements Rule
public function passes($attribute, $value)
// some logic, returns TRUE if valid.
public function message()
//
我的控制器
namespace App\Http\Controllers;
use App\Rules\SomeRule;
use Illuminate\Http\Request;
class LoanController extends Controller
public function store(Request $request)
$request->validate([
'email' => ['required', new SomeRule]
]);
// ...insert in database, return json.
我的测试
namespace Tests\Feature;
use Mockery;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Rules\SomeRule;
class LoansTest extends TestCase
use RefreshDatabase;
public function tearDown(): void
parent::tearDown();
Mockery::close();
/** @test */
public function the_sad_path__when_email_is_invalid()
$rule = Mockery::mock(SomeRule::class)->shouldReceive('passes')->once();
$this->app->instance(SomeRule::class, $rule);
$response = $this->json('POST', '/api/loans', ['email' => 'whatevs@gmail.com']);
我尝试了在 AppServiceProvider 中注册 SomeRule 的想法。但这仍然没有做任何事情:
public function register()
$this->app->bind(SomeRule::class, function ($app)
return new SomeRule();
);
Github中的代码
【问题讨论】:
查看这个:***.com/questions/59853235/… 这能回答你的问题吗? Mocking Laravel custom validation rule class not working 【参考方案1】:你需要这样使用
class LoanController extends Controller
public function store(Request $request)
$request->validate([
'email' => ['required', new SomeRule()]
]);
// ...insert in database, return json.
【讨论】:
你知道两者的区别吗?在documentation 中,它没有()
; 'name' => ['required', 'string', new Uppercase],
没关系。 ***.com/questions/28914283/…
你能解决这个问题吗?我试图在测试中模拟自定义验证器的传递方法并抛出“方法....不存在”错误以上是关于如何在 Laravel 中模拟验证规则的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中验证数组时,如何使用数组项规则添加验证自定义消息?