簡體   English   中英

如何在Laravel中模擬驗證規則

[英]How to mock a Validation Rule in 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中的代碼

你需要像這樣使用

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM