<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                * * * * * [TOC] ## 介紹 測試 Laravel 應用時,有時候你可能想要「模擬」實現應用的部分功能的行為,從而避免該部分在測試過程中真正執行。例如,控制器執行過程中會觸發一個事件( Events ),你想要模擬這個事件的監聽器,從而避免該事件在測試這個控制器時真正執行。如上可以讓你僅測試控制器的 HTTP 響應情況,而不用去擔心觸發事件。當然,你可以在單獨的測試中測試該事件的邏輯。 Laravel 針對事件、任務和 facades 的模擬提供了開箱即用的輔助函數。這些輔助函數基于 Mockery 封裝而成,使用非常簡單,無需你手動調用復雜的 Mockery 函數。當然,你也可以使用?[Mockery](http://docs.mockery.io/en/latest/)?或者 PHPUnit 創建自己的模擬器。 ## 任務模擬 你可以使用?`Bus`?facade 的?`fake`?方法來模擬任務執行,測試的時候任務不會被真實執行。使用 fakes 的時候,斷言一般出現在測試代碼的后面: ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use App\Jobs\ShipOrder; use Illuminate\Support\Facades\Bus; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { public function testOrderShipping() { Bus::fake(); // 處理訂單發貨... Bus::assertDispatched(ShipOrder::class, function ($job) use ($order) { return $job->order->id === $order->id; }); // 斷言任務并沒有被執行... Bus::assertNotDispatched(AnotherJob::class); } } ~~~ ## 事件模擬 你可以使用?`Event`?facade 的?`fake`?方法來模擬事件監聽,測試的時候不會觸發事件監聽器運行。然后你就可以斷言事件運行了,甚至可以檢查它們收到的數據。使用 fakes 的時候,斷言一般出現在測試代碼的后面: ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use App\Events\OrderShipped; use App\Events\OrderFailedToShip; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { /** * 測試訂單發貨. */ public function testOrderShipping() { Event::fake(); // 處理訂單發貨... Event::assertDispatched(OrderShipped::class, function ($e) use ($order) { return $e->order->id === $order->id; }); Event::assertNotDispatched(OrderFailedToShip::class); } } ~~~ ## 郵件模擬 你可以使用?`Mail`?facade 的?`fake`?方法來模擬郵件發送,測試時不會真的發送郵件。然后你可以斷言?[mailables](https://laravel-china.org/docs/laravel/5.4/mail)?發送給了用戶,甚至可以檢查他們收到的數據. 使用 fakes 時,斷言一般在測試代碼的后面: ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use App\Mail\OrderShipped; use Illuminate\Support\Facades\Mail; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { public function testOrderShipping() { Mail::fake(); // 處理訂單發貨... Mail::assertSent(OrderShipped::class, function ($mail) use ($order) { return $mail->order->id === $order->id; }); // 斷言一封郵件已經發送給了指定用戶... Mail::assertSent(OrderShipped::class, function ($mail) use ($user) { return $mail->hasTo($user->email) && $mail->hasCc('...') && $mail->hasBcc('...'); }); // 斷言 mailable 沒有發送... Mail::assertNotSent(AnotherMailable::class); } } ~~~ ## 通知模擬 你可以使用?`Notification`?facade 的?`fake`?方法來模擬通知發送,測試的時候并不會真的發送通知。然后你可以斷言?[通知](https://laravel-china.org/docs/laravel/5.4/notifications)?已經發送給你的用戶,甚至可以檢查他們收到的數據。使用 fakes 時, 斷言一般出現在測試代碼的后面. ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use App\Notifications\OrderShipped; use Illuminate\Support\Facades\Notification; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { public function testOrderShipping() { Notification::fake(); // 處理訂單發貨... Notification::assertSentTo( $user, OrderShipped::class, function ($notification, $channels) use ($order) { return $notification->order->id === $order->id; } ); // 斷言通知已經發送給了指定用戶... Notification::assertSentTo( [$user], OrderShipped::class ); // 斷言通知沒有發送... Notification::assertNotSentTo( [$user], AnotherNotification::class ); } } ~~~ ## 隊列模擬 你可以使用?`Queue`?facade 的?`fake`?方法來模擬任務隊列,測試的時候并不會真的把任務放入隊列。然后你可以斷言任務被放進了隊列,甚至可以檢查它們收到的數據。使用 fakes 的時候,斷言一般出現在測試代碼的后面。 ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use App\Jobs\ShipOrder; use Illuminate\Support\Facades\Queue; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { public function testOrderShipping() { Queue::fake(); // 處理訂單發貨... Queue::assertPushed(ShipOrder::class, function ($job) use ($order) { return $job->order->id === $order->id; }); // 斷言任務進入了指定隊列 Queue::assertPushedOn('queue-name', ShipOrder::class); // 斷言任務沒有進入隊列 Queue::assertNotPushed(AnotherJob::class); } } ~~~ ## Storage 模擬 利用?`Storage`?facade 的?`fake`?方法,你可以輕松地生成一個模擬的磁盤,結合?`UploadedFile`?類的文件生成工具,極大地簡化了文件上傳測試。例如: ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { public function testAvatarUpload() { Storage::fake('avatars'); $response = $this->json('POST', '/avatar', [ 'avatar' => UploadedFile::fake()->image('avatar.jpg') ]); // 斷言文件已存儲 Storage::disk('avatars')->assertExists('avatar.jpg'); // 斷言文件不存在 Storage::disk('avatars')->assertMissing('missing.jpg'); } } ~~~ ## Facades 模擬 不同于傳統的靜態函數的調用,?[facades](https://laravel-china.org/docs/laravel/5.4/facades)?也是可以被模擬的,相對靜態函數來說這是個巨大的優勢,即使你在使用依賴注入,測試時依然會非常方便。在很多測試中,你可能經常想在控制器中模擬對 Laravel facade 的調用。比如下面控制器中的行為: ~~~ <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Cache; class UserController extends Controller { /** * 顯示網站的所有用戶 * * @return Response */ public function index() { $value = Cache::get('key'); // } } ~~~ 我們可以通過?`shouldReceive`?方法來模擬?`Cache`?facade ,此函數會返回一個?[Mockery](https://github.com/padraic/mockery)?實例,由于對 facade 的調用實際上都是由 Laravel 的?[服務容器](https://laravel-china.org/docs/laravel/5.4/container)?管理的,所以 facade 能比傳統的靜態類表現出更好的測試便利性。接下來,讓我們來模擬一下?`Cache`?facade 的?`get`?方法的調用: ~~~ <?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Support\Facades\Cache; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class UserControllerTest extends TestCase { public function testGetIndex() { Cache::shouldReceive('get') ->once() ->with('key') ->andReturn('value'); $response = $this->get('/users'); // ... } } ~~~ > {note} 不可以模擬?`Request`?facade,測試時,如果需要傳遞指定的數據請使用 HTTP 輔助函數,例如?`get`?和?`post`。類似的,請在你的測試中通過調用?`Config::set`?來模擬?`Config`?facade。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看