首页 > 解决方案 > 如何在 Laravel 中模拟验证规则

问题描述

我想模拟一个自定义验证规则(例如 App\Rules\SomeRule)。但是当我运行我的测试时,它给出了一个Mockery\Exception\InvalidCountException: Method...should be called exactly 1 times but called 0 times.

我已经阅读了 Laravel关于 Mocking自定义验证规则服务容器服务提供者的文档,但我无法弄清楚为什么我没有成功地模拟规则。

我读了这个帖子,但我很难将它与我的问题联系起来,即“我如何测试我的应用程序是否正在使用这个规则”。或者那是我无法测试的东西?

这是我的规则

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中的代码

标签: phplaravelmockingmockery

解决方案


你需要像这样使用

class LoanController extends Controller
{
    public function store(Request $request)
    {
      $request->validate([
        'email' => ['required', new SomeRule()]
      ]);

    // ...insert in database, return json.
   }
}

推荐阅读